[英]Pandas- Dividing a column by another column conditional on if values are greater than 0?
我有一個包含日期,項目和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'])
對於發生了什么的任何想法? 是無限運行會導致它崩潰嗎? 謝謝您的幫助。
你可以使用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
使用pd.Series.mask
隱藏零,然后使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.