我试图将Numpy数组列表作为元素添加到Pandas DataFrame中:

DataFrame

使用:

df.loc[df['B']==4,'A'] = [np.array([5, 6, 7, 8]),np.array([2,3])]

是否允许这样做似乎取决于我如何初始化df:

Testing two different initialisations of df

有人能给我解释一下发生了什么事吗?

以下是文本形式的代码,供每个人try :

The code that's not working

df = pd.DataFrame(columns=['A','B'])
a = [1,2,0,4,5]
b = [3,4,4,7,3]

df['A'] = a
df['B'] = b

df.loc[df['B']==4,'A'] = [np.array([5, 6, 7, 8]),np.array([2,3])]
df

The code that's working

df = pd.DataFrame(columns=['A','B'])
a = [1,2,0,4,5]
b = [3,4,4,7,3]

for i in range(len(a)):
    df.loc[i,'A'] = a[i]
    df.loc[i,'B'] = b[i]

df.loc[df['B']==4,'A'] = [np.array([5, 6, 7, 8]),np.array([2,3])]
df

推荐答案

您必须使用正确的索引创建一个Series:

m = df['B']==4

df.loc[m, 'A'] = pd.Series([np.array([5, 6, 7, 8]), np.array([2, 3])],
                           index=df.index[m])

注意,在pandas的future 版本中,这可能会触发一个错误,因为A的原始dtype是integer.首先,你需要转换为Object:

df['A'] = df['A'].astype(object)

m = df['B']==4

df.loc[m, 'A'] = pd.Series([np.array([5, 6, 7, 8]), np.array([2, 3])],
                           index=df.index[m])

输出:

              A  B
0             1  3
1  [5, 6, 7, 8]  4
2        [2, 3]  4
3             4  7
4             5  3
why does the second approach work?

不确定,很可能是由于DataFrame的特殊内部状态(我怀疑,因为它完全是从一个循环和一个空对象DataFrame初始化的),但这很可能不起作用,而且非常不稳定.

例如,如果添加另一列(Even对象),则此操作将失败:

df = pd.DataFrame(columns=['A','B'])
a = [1,2,0,4,5]
b = [3,4,4,7,3]

df['C'] = 'X'  # we just add one extra column

for i in range(len(a)):
    df.loc[i,'A'] = a[i]
    df.loc[i,'B'] = b[i]

df.loc[df['B']==4,'A'] = [np.array([5, 6, 7, 8]), np.array([2, 3])]
# error

但是,从单个块对象NumPy数组创建DataFrame是可行的:

a = [1,2,0,4,5]
b = [3,4,4,7,3]
df = pd.DataFrame(np.c_[a, b].astype('object'), columns=['A','B'])
df.loc[df['B']==4, 'A'] = [np.array([5, 6, 7, 8]), np.array([2, 3])]
# no error

Python相关问答推荐

如何让 turtle 通过点击和拖动来绘制?

max_of_three使用First_select、second_select、

对于一个给定的数字,找出一个整数的最小和最大可能的和

Pandas 都是(),但有一个门槛

如何记录脚本输出

大小为M的第N位_计数(或人口计数)的公式

Pandas Loc Select 到NaN和值列表

无法连接到Keycloat服务器

如何在FastAPI中为我上传的json文件提供索引ID?

在Python中计算连续天数

如何杀死一个进程,我的Python可执行文件以sudo启动?

为什么常规操作不以其就地对应操作为基础?

找到相对于列表索引的当前最大值列表""

无法在Spyder上的Pandas中将本地CSV转换为数据帧

为什么t sns.barplot图例不显示所有值?'

如何在验证文本列表时使正则表达式无序?

与同步和异步客户端兼容的Python函数

Pandas ,快速从词典栏中提取信息到新栏

了解如何让库认识到我具有所需的依赖项

Pandas 数据框自定义排序功能