所以我有这个:
df = pd.DataFrame({'array': [[], [], []]})
# need to add an element in index 0
df[df.index==0].array[0].append(1) # works! add 1 to first row
df[df.index==1].array[0].append(2) # doesnt work!
df[df.index==1].array[1].append(2) # works! add 2 to second row
df.array[3].append(10) # works! add 10 to 3rd row
我的问题是为什么?我不明白。如果我想将多个相似元素添加到多个列表怎么办?
df[df.index>0].array.append(2) # obviously does not work
[说明]
一些解释。我认为部分问题出在我如何创建原始数据框
# This was how I created it
df = pd.DataFrame({'array': 3 * [[]]})
# It gives different result than this method:
df = pd.DataFrame({'array': [[] for i in range(3)]
# Or this method:
df = pd.DataFrame({'array': [[], [], []] })
除此之外,我意识到它非常相似。尽管答案比链接的线程提供了更多的解释。因此希望这个问题能够解决。请让我知道是否需要删除此主题,因为我想保存所有来自此处的答案和建议。
答案 0 :(得分:2)
当您致电df[df.index==1]
时,您会感到厌烦:
1 []
Name: array, dtype: object
请注意数字1 -您正在对索引进行切片,因此在尝试访问索引时很有意义:
df[df.index==1].array[0]
它试图获取一个不存在的 zeroth 元素。由于这个和其他原因,pandas
提供了iloc
和loc
。以下将按预期执行并产生结果:
df = pd.DataFrame({'array': [[], [], []]})
df.iloc[0].array.append(0)
df.iloc[1].array.append(2)
df.iloc[0].array.append(0)
df.iloc[1].array.append(2)
答案 1 :(得分:1)
for x in df[df.index>0].array:
x.append(2)
df[df.index>0].array.append(2)
不起作用,因为df[df.index>0].array
返回一系列列表,因此我们必须枚举该系列并将其插入每个列表中。
答案 2 :(得分:1)
如果您尝试使用逻辑表达式选择要添加到单元格列表中的项目,则需要使用其他方法。
Pandas使用“常规”方法名称对序列进行操作,以引用实际Pandas数据框。因此,您不能仅以与a[i].append
相同的方式进行a[i] *= 2
。 :-(
This question有很多有用的答案。我认为您想要的那个可能看起来像这样:
h[1] >>> print(f)
array
0 []
1 []
2 []
h[1] >>> f[f.index>0].array.apply([2].__add__)
1 [2]
2 [2]
Name: array, dtype: object
答案 3 :(得分:1)
问题的一部分是,您似乎正在尝试访问实际上不存在的索引,因此您需要确保它们确实存在。为了追加数组,您可以使用iloc
或iat
,通常建议使用后者来访问整数:
import pandas as pd
df = pd.DataFrame({'array': [[], [], []]})
# need to add an element in index 0
df.iat[0,0].append(1) # works! add 1 to first row
df.iat[1,0].append(2) # works! add 2 to second row
df.iat[1,0].append(2) # works! add another 2 to second row
df.iat[2,0].append(10) # works! add 10 to 3rd row
结果:
array
0 [1]
1 [2, 2]
2 [10]
iat
按整数位置访问行/列对的单个值。与iloc相似,两者都提供基于整数的查找。 如果您只需要在DataFrame或Series中获取或设置单个值,请使用iat。