Pandas DataFrame 的条件计算列

Posted

技术标签:

【中文标题】Pandas DataFrame 的条件计算列【英文标题】:Conditionally calculated column for a Pandas DataFrame 【发布时间】:2017-03-01 06:23:24 【问题描述】:

我在 Pandas DataFrame 中有一个计算列,需要根据条件进行分配。例如:

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

但是,这会返回错误:

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

我感觉这与必须以矩阵样式完成的事实有关。将代码更改为三元语句也不起作用:

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

有人知道实现此目的的正确方法吗?将 apply 与 lambda 一起使用?我可以通过循环进行迭代,但我宁愿将其作为 Pandas 的首选方式。

【问题讨论】:

【参考方案1】:

你可以这样做:

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

【讨论】:

【参考方案2】:

使用 where() 和 notnull()

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

【讨论】:

【参考方案3】:

另一种做法如下

import numpy as np

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

【讨论】:

以上是关于Pandas DataFrame 的条件计算列的主要内容,如果未能解决你的问题,请参考以下文章

绘制带有条件列的 pandas DataFrame

pandas基于条件判断更新dataframe中特定数据列数值内容的值(Conditionally updating values in specific pandas Dataframe )

如何根据列表有条件地更新 Pandas 中的 DataFrame 列

如何使用多个布尔条件选择 Pandas DataFrame 中的特定列

Pandas DataFrame:根据条件替换列中的所有值

根据多个条件将新列添加到 Python Pandas DataFrame [重复]