将元素添加到指定数据框行中的列表

时间:2019-03-11 16:15:09

标签: python pandas dataframe

所以我有这个:

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': [[], [], []] })

除此之外,我意识到它非常相似。尽管答案比链接的线程提供了更多的解释。因此希望这个问题能够解决。请让我知道是否需要删除此主题,因为我想保存所有来自此处的答案和建议。

4 个答案:

答案 0 :(得分:2)

当您致电df[df.index==1]时,您会感到厌烦:

1    []
Name: array, dtype: object

请注意数字1 -您正在对索引进行切片,因此在尝试访问索引时很有意义:

df[df.index==1].array[0]

它试图获取一个不存在的 zeroth 元素。由于这个和其他原因,pandas提供了ilocloc。以下将按预期执行并产生结果:

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)

问题的一部分是,您似乎正在尝试访问实际上不存在的索引,因此您需要确保它们确实存在。为了追加数组,您可以使用ilociat,通常建议使用后者来访问整数:

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

pandas.DataFrame.iat