我有一个如下数据框:
df = pd.DataFrame([[2,[4,6,8]],[3,[6,9]],[5,[10]],[7,[]]],columns = ['A','B'])
A B
0 2 [4, 6, 8]
1 3 [6, 9]
2 5 [10]
3 7 []
我想在第一列使用条件附加列表。例如,在单元格df.ix[1,'B']
中添加12。为此,以下工作:
df.ix[1,'b'].append(12)
但是现在我不知道行的索引,只是A
列中值的条件。使用切片产生数据帧而不是单元格,因此我不能像以前一样附加单元格的值。 (请注意A
中的velues是唯一的,没有重复的内容)
df.ix[df.A == 3,'B'].append(12)
TypeError: cannot concatenate a non-NDFrame object
所以我的问题如下:
如何使用A
列值上的条件在此单元格中附加列表?
答案 0 :(得分:2)
您可以利用pandas将使用+
运算符,因为它是为底层对象定义的。在这种情况下,[10] + [12]
为[10, 12]
。我使用的条件只是为了说明不需要只有一行。
df.loc[df.A > 4, 'B'] += [12]
print(df)
A B
0 2 [4, 6, 8]
1 3 [6, 9]
2 5 [10, 12]
3 7 [12]
如果您B
列的某些字段不是lists
,我们可以通过函数进行制作。
def listify(x):
try:
return list(x)
except:
return [x]
df.B = df.B.apply(listify)
示例
考虑数据框df
df = pd.DataFrame(
[[2,[4,6,8]],[3,[6,9]],[5,[10]],[7,[]], [9, 1]],
columns = ['A','B'])
print(df)
A B
0 2 [4, 6, 8]
1 3 [6, 9]
2 5 [10]
3 7 []
4 9 1
如果我们尝试我的建议,我们会得到
> TypeError:+:'int'和'list'
的不支持的操作数类型一旦我们listify
df.B = df.B.apply(listify)
print(df)
A B
0 2 [4, 6, 8]
1 3 [6, 9]
2 5 [10]
3 7 []
4 9 [1]
现在我们可以
df.loc[df.A > 4, 'B'] += [12]
print(df)
A B
0 2 [4, 6, 8]
1 3 [6, 9]
2 5 [10, 12]
3 7 [12]
4 9 [1, 12]
答案 1 :(得分:1)
这不是在df中存储列表的正常操作,但是在这里你需要系列的索引标签,这样你就可以append
:
In [68]:
idx = df.loc[df['A'] == 3,'B'].index[0]
df.loc[df['A'] == 3,'B'][idx].append(12)
df
Out[68]:
A B
0 2 [4, 6, 8]
1 3 [6, 9, 12]
2 5 [10]
3 7 []
此处df.loc[df['A'] == 3, 'B']
会返回Series
:
In [70]:
df.loc[df['A'] == 3,'B']
Out[70]:
1 [6, 9]
Name: B, dtype: object
此处存储的元素需要使用索引标签解除引用:
In [71]:
df.loc[df['A'] == 3,'B'][1]
Out[71]:
[6, 9]
所以你需要找出索引标签:
In [72]:
df.loc[df['A'] == 3,'B'].index[0]
Out[72]:
1
因此,您可以取消引用该列表并append