Pandas DataFrame

时间:2016-10-19 14:29:10

标签: python pandas dataframe

我在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方式。

2 个答案:

答案 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)