我在Pandas DataFrame中有一个计算列,需要根据条件进行分配。例如:
if(data['column_a'] == 0):
data['column_c'] = 0
else:
data['column_c'] = data['column_b']
然而,这会返回错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我觉得这与必须以矩阵式完成的事实有关。将代码更改为三元语句也不起作用:
data['column_c'] = 0 if data['column_a'] == 0 else data['column_b']
任何人都知道实现这个目标的正确方法吗?使用lambda?我可以通过循环迭代,但我宁愿保持这是首选的Pandas方式。
答案 0 :(得分:2)
你可以这样做:
data['column_c'] = data['column_a'].where(data['column_a'] == 0, data['column_b'])
这是向量化你的尝试失败,因为与if
的比较并不理解如何处理布尔值数组因此错误
示例:
In [81]:
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
df
Out[81]:
a b c
0 -1.065074 -1.294718 0.165750
1 -0.041167 0.962203 0.741852
2 0.714889 0.056171 1.197534
3 0.741988 0.836636 -0.660314
4 0.074554 -1.246847 0.183654
In [82]:
df['d'] = df['b'].where(df['b'] < 0, df['c'])
df
Out[82]:
a b c d
0 -1.065074 -1.294718 0.165750 -1.294718
1 -0.041167 0.962203 0.741852 0.741852
2 0.714889 0.056171 1.197534 1.197534
3 0.741988 0.836636 -0.660314 -0.660314
4 0.074554 -1.246847 0.183654 -1.246847
答案 1 :(得分:0)
使用where()和notnull()
data['column_c'] = data['column_b'].where(data['column_a'].notnull(), 0)