2014-11-06 34 views
1

我的數據幀具有浮點和布爾的混合:如何計算pandas數據框中bool和float列的新矢量化列?

df = pd.DataFrame.from_csv("C:\....") 

df['isActive'] = (df.turns >= 250) & (df.alivePct > 0) & (df.changePct > 0) 

我想創建一個新的列,其中,如果isActive == false,則值= 0,否則值等於一些計算量的,是這樣的:

df['interestingness'] = (df.changePct * df.alivePct) if df.isActive else 0 

但是因爲df.isActive是一個系列,我得到這個錯誤:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

看來,三元的if/else操作員不能用於矢量化操作。

我該怎麼做手動迭代呢?

(注:一個簡單的黑客是通過df.isActive多次將其值設置爲0爲假== 0,但是我想知道一個更通用的解決方案。)

+0

你是什麼更普遍的是什麼意思?另外,爲什麼它是黑客?它不會真正得到更多的普遍/比乘法少hacky ... – acushner 2014-11-06 15:40:15

+0

也,我的意思是,我看到你的關注,如「如果布爾人不是0和1?」但我會想,是的,只是將它們轉換成零和一個,然後返回乘法。 'np.where'解決方案也不錯。 – acushner 2014-11-06 15:44:17

回答

3

你可以使用np.where

import numpy as np 
df['interestingness'] = np.where(df.isActive, df.changePct * df.alivePct, 0) 

對於一維數組,np.where(condition, A, B)經過矢量相當於

np.array([a if c else b for a,b,c in zip(condition, A, B)]) 

熊貓還提供了一個Series.where方法,你可以使用:

df['interestingness'] = (df.changePct * df.alivePct).where(df.isActive, 0) 
0

不同的解決方案,也許還不如讀,但是作品。

創建新列/系列:

>>> df 
    0  1 2 
0 1 True 9 
1 2 False 9 
2 3 True 9 
3 4 False 9 
4 5 True 9 
>>> df[3] = 0 

使用口罩

>>> mask = df[1] 
>>> df[3][mask] = (df[0] * df[2])[mask] 
>>> df 
    0  1 2 3 
0 1 True 9 9 
1 2 False 9 0 
2 3 True 9 27 
3 4 False 9 0 
4 5 True 9 45 
>>> 
相關問題