向pandas DataFrame添加行会改变数据类型

15
我遇到的问题是向DataFrame添加一行会改变列的数据类型:
>>> from pandas import DataFrame
>>> df = DataFrame({'a' : range(10)}, dtype='i4')
>>> df
   a
0  0
1  1
2  2
3  3
4  4
5  5
6  6
7  7
8  8
9  9

[10 rows x 1 columns]

我特别指定dtype为int32(即“i4”),如下所示:

>>> df.dtypes
a    int32
dtype: object

然而,添加一行会改变数据类型为float64:

>>> df.loc[10] = 99

>>> df
     a
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
10  99

[11 rows x 1 columns]

>>> df.dtypes
a    float64
dtype: object

我试过指定我添加的值的数据类型:
>>> import numpy as np
>>> df = DataFrame({'a' : np.arange(10, dtype=np.int32)})

>>> df.dtypes
a    int32
dtype: object

>>> df.loc[10] = np.int32(0)

>>> df.dtypes
a    float64
dtype: object

但这也行不通。有没有解决方案,而不使用返回新对象的函数?
2个回答

13

扩大是分为2个阶段完成的,首先在该列中放置一个nan,然后将其分配,这就是为什么需要强制转换。我会将其放在错误/增强清单上。这有点棘手。

以下是一种解决方法,通过使用附加方式。

<code>In [14]: df.append(Series(99,[10],dtype='i4').to_frame('a'))
Out[14]: 
     a
0    0
1    1
2    2
3    3
4    4
5    5
6    6
7    7
8    8
9    9
10  99

[11 rows x 1 columns]

In [15]: df.append(Series(99,[10],dtype='i4').to_frame('a')).dtypes
Out[15]: 
a    int32
dtype: object
</code>

一个自动解决此问题/增强功能的问题:https://github.com/pydata/pandas/issues/6485


3
如果有人想了解为什么NaN被强制转换为浮点数,可以参考这个链接:http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na(我之前就被这个问题难住了) - fantabolous

0

由于现在更倾向于使用concat,这里提供另一种解决方案:

df = pd.concat([df, DataFrame({'a':99}, [10], dtype='i4')])
df.dtypes
Out[12]: 
a    int32
dtype: object

append()在pandas 1.4.0中已被弃用:

未来警告:frame.append方法已被弃用,并将在未来版本中从pandas中删除。请改用pandas.concat。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接