Pandas-将列除以另一列,条件是值是否大于0?

时间:2017-11-21 23:19:37

标签: python pandas if-statement dataframe

我有一个包含日期,项目和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'])

有关进展情况的任何想法?是无限运行会导致它崩溃吗?谢谢您的帮助。

2 个答案:

答案 0 :(得分:4)

您可以使用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)

答案 1 :(得分:3)

选项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