向熊猫数据帧添加行会更改 dtype



我遇到的问题是向数据帧添加一行会更改列的dtype:

>>> 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

但是,添加行会将 dtype 更改为 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

尝试指定我添加的值的 dtype:

>>> 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

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

放大分两个阶段完成,首先在该列中放置一个nan,然后分配它,所以这就是它被强制的原因。我会把它放在错误/增强列表中。它有点不平凡。

下面是使用追加的解决方法。

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

错误/增强功能自动执行此操作的问题:https://github.com/pydata/pandas/issues/6485

由于现在首选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.concat

最新更新