Pandas DataFrame的有条件计算列

10

我有一个 Pandas DataFrame 中的计算列,需要根据条件进行赋值。例如:

if(data['column_a'] == 0):
    data['column_c'] = 0
else:
    data['column_c'] = data['column_b']

然而,这会返回一个错误:

ValueError: 系列的真值是模棱两可的。请使用a.empty、a.bool()、a.item()、a.any()或a.all()。

我有一种感觉这与必须按矩阵方式进行有关。 将代码更改为三元语句也不起作用:

data['column_c'] = 0 if data['column_a'] == 0 else data['column_b']

有人知道实现这个的正确方法吗?使用带有 lambda 的 apply 吗?我可以通过循环迭代来实现,但我更愿意保持 Pandas 的首选方式。

3个回答

15

您可以做:

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

0

另一种方法如下

import numpy as np

data['column_c'] = np.where(data['column_a'] == 0, data['column_a'], data['column_b'])

0
使用 where() 和 notnull()。
   data['column_c'] = data['column_b'].where(data['column_a'].notnull(), 0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接