将数组添加到 Pandas 数据帧

3

我有一个数据框,想要创建一个新列,并将数组添加到每一行的新列中。我知道需要将该列的数据类型更改为“object”才能实现此目的。我尝试了以下方法,但无法成功:

import pandas
import numpy as np

df = pandas.DataFrame({'a':[1,2,3,4]})
df['b'] = np.nan
df['b'] = df['b'].astype(object)
df.loc[0,'b'] = [[1,2,4,5]]

错误是:
ValueError: Must have equal len keys and value when setting with an ndarray

但是,如果我将整个数据框的数据类型转换为 'object',它就能起作用:
df = pandas.DataFrame({'a':[1,2,3,4]})
df['b'] = np.nan
df = df.astype(object)
df.loc[0,'b'] = [[1,2,4,5]] 

所以我的问题是:为什么我必须更改整个DataFrame的数据类型?
1个回答

3

试试这个:

In [12]: df.at[0,'b'] = [1,2,4,5]

In [13]: df
Out[13]:
   a             b
0  1  [1, 2, 4, 5]
1  2           NaN
2  3           NaN
3  4           NaN

请注意,一旦在任何单元格中放入非标量值,相应列的数据类型将更改为object,以便能够包含非标量值:

In [14]: df.dtypes
Out[14]:
a     int64
b    object
dtype: object

通常情况下,在单元格中存储非标量值是不好的做法,因为大多数Pandas/Numpy方法在处理这种数据时会出现问题。


这是我第一次遇到.at,为什么不用loc呢? - iDrwish
2
@iDrwish,.at.iat是为处理__单个__单元格而设计的,而.loc.iloc则更加复杂,并具有更多用于对齐数据等逻辑。 - MaxU - stand with Ukraine
谢谢您的回答。但是在我的原始示例中,为什么我需要更改整个数据框的数据类型,而不仅仅是列呢? - lizardfireman
@lizardfireman,使用.at - 你不需要将整个DF转换为object dtype - 参见我的答案中的df.dtypes输出。关于“为什么在整个DF转换为object dtype时df.loc[0,'b'] = [[...]]能够工作” - 我不知道... - MaxU - stand with Ukraine
1
+1,性能提示:atiat(两者都很少使用)比基于.loc的等效方法更高效,用于访问标量。 - jpp

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