【问题标题】:Pandas- Dividing a column by another column conditional on if values are greater than 0?Pandas-以如果值大于0为条件,将一列除以另一列?
【发布时间】:2017-11-21 23:19:37
【问题描述】:

我有一个包含日期、项目和 2 个值的 pandas 数据框。我要做的就是输出另一列,如果 B 列大于 0,则输出 A 列 / B 列的乘积,如果 B 列等于 0,则输出 0。

   date     item   A   B        C       
 1/1/2017   a      0   3             0  
 1/1/2017   b      2   0             0  
 1/1/2017   c      5   2           2.5  
 1/1/2017   d      4   1             4  
 1/1/2017   e      3   3             1  
 1/1/2017   f      0   4             0  
 1/2/2017   a      3   3             1  
 1/2/2017   b      2   2             1  
 1/2/2017   c      3   9   0.333333333  
 1/2/2017   d      4   0             0  
 1/2/2017   e      5   3   1.666666667  
 1/2/2017   f      3   0             0  

这是我编写的代码,但内核一直在死机(请记住,这只是一个示例表,我有大约 30,000 行,所以没什么太疯狂的)

df['C'] = df.loc[df['B'] > 0, 'A'] / df['B'])

知道发生了什么吗?是否有东西无限运行导致它崩溃?谢谢您的帮助。

【问题讨论】:

  • 它会在较小的数据帧上崩溃吗?先验听起来像一个错误。尝试缩小到导致崩溃的行/行集。

标签: python pandas if-statement dataframe


【解决方案1】:

您可以使用 np.where 得到它

df['C'] = np.round(np.where(df['B'] > 0, df['A']/df['B'], 0), 1)

或者如果你想使用loc

df.loc[df['B'] > 0, 'C'] = df['A']/df['B']

然后fillna(0)

【讨论】:

  • 不错的一个。这将是我的第一选择。
  • 太好了-感谢分享!也许这是我的错误,但我遇到了一个问题,即试图在数据帧的切片副本上设置一个值?我之前没有遇到过这个问题,所以我想知道是不是这个脚本造成的。
  • @DickThompson,您是否通过截取更大数据帧的一部分来创建此数据帧?
  • 检查这个链接,它很好地解释了这个问题。 stackoverflow.com/questions/20625582/…
  • 是的,感谢您的帮助-我想我只是感到困惑。所以我还想做的是基本上比较每个项目与整个组,所以其中一个列中的值只是每个项目的值的分组,日期减去该行的值.即df['A'] = df['B'].groupby['date'].transform('sum') - df['B'] 那么正确的方法是什么?我有点迷茫
【解决方案2】:

选项 1
您使用pd.Series.mask 隐藏零,然后使用fillna 清空单元格。

v = (df.A / df.B.mask(df.B == 0)).fillna(0)
v

0     0.000000
1     0.000000
2     2.500000
3     4.000000
4     1.000000
5     0.000000
6     1.000000
7     1.000000
8     0.333333
9     0.000000
10    1.666667
11    0.000000
dtype: float64

df['C'] = v

或者,将这些零替换为np.inf,因为x / inf = 0

df['C'] = (df.A / df.B.mask(df.B == 0, np.inf))

选项 2
直接替换为df.replace

df.A / df.B.replace(0, np.inf)

0     0.000000
1     0.000000
2     2.500000
3     4.000000
4     1.000000
5     0.000000
6     1.000000
7     1.000000
8     0.333333
9     0.000000
10    1.666667
11    0.000000
dtype: float64

请记住,如果您想要混合整数和浮点数作为结果,您可以进行 astype 转换:

df.A.div(df.B.replace(0, np.inf)).astype(object)

0            0
1            0
2          2.5
3            4
4            1
5            0
6            1
7            1
8     0.333333
9            0
10     1.66667
11           0
dtype: object

【讨论】:

  • 我是关于...发布选项 2 :-) 哈哈
  • @文哈哈,我可以删除,你可以发帖。
  • 不需要,我的意思是在您的评论中发布。:-) 不是答案
猜你喜欢
  • 2020-01-27
  • 2016-05-28
  • 2018-05-19
  • 2012-01-05
  • 1970-01-01
  • 2017-03-31
  • 2021-07-17
  • 2021-04-21
  • 1970-01-01
相关资源
最近更新 更多