将行添加到pandas DataFrame会更改dtype

lmyy7pcs  于 2023-05-27  发布在  其他
关注(0)|答案(2)|浏览(205)

我遇到的问题是,向DataFrame添加一行会更改列的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

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

gk7wooem

gk7wooem1#

放大分两个阶段完成,首先将nan放置在该列中,然后对其进行赋值,因此这就是强制执行的原因。我会把它放在bug/增强列表中。它有点不平凡。
这里有一个解决方法,使用append。

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

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

wlp8pajw

wlp8pajw2#

由于concat现在是首选,这里有另一个解决方案:

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

append()在pandas 1.4.0中被弃用:
未来警告:append方法已被弃用,并将在未来版本中从pandas中删除。使用pandas.concat代替。

相关问题