2016-07-18 156 views
1

我有一個數據幀data它看起來像一個數據幀列:灌裝基於多個條件選擇

Holiday Report Action  Power 
0    0  0  1.345 
0    0  0  1.345 
1    0  0  0 
0    0  0  1.345 
0    0  0  1.345 
0    1  0  0 
0    0  0  1.345 
0    1  1  0 
0    0  0  1.345 
0    0  1  0 

列「假日」,「報告」和「操作」在拉着尋找一個功率進行計算。一些其他數據列。我正在尋找一行代碼,如果有任何「假期」,「報告」或「操作」列設置爲1,我可以將電源設置爲零。

我可以執行此過程一列在一段時間:

data.loc[staticidx, "power"] = np.where(dayData.Holiday = 1, 0, (a - b)/(c-1)) 
data.loc[staticidx, "power"] = np.where(dayData.Report= 1, 0, (a - b)/(c-1)) 
data.loc[staticidx, "power"] = np.where(dayData.Actions= 1, 0, (a - b)/(c-1)) 

但是有沒有辦法將它們合併成一個函數,像一個OR語句的東西?

非常感謝

回答

3

您可以通過切片子查詢行,比較對1和使用any與PARAM axis=1,並創建一個布爾面具傳遞給loc設置只有那些滿足所期望的條件1行:

In [23]: 
df.loc[(df.ix[:,:'Action'] == 1).any(axis=1), 'Power'] = 1 
df 

Out[23]: 
    Holiday Report Action Power 
0  0  0  0 1.345 
1  0  0  0 1.345 
2  1  0  0 1.000 
3  0  0  0 1.345 
4  0  0  0 1.345 
5  0  1  0 1.000 
6  0  0  0 1.345 
7  0  1  1 1.000 
8  0  0  0 1.345 
9  0  0  1 1.000 
+0

也許事端g like:'np.where((df.ix [:,:'Action'] == 1).any(axis = 1),0,1.345)'? – Divakar

+0

@Divakar處理所有行,在這裏使用'loc'只會更新符合條件的行,而不會改變任何現有的值 – EdChum

+0

哦,是的。所以,我猜你可以避免'> 0'並且賦值需要是'0'而不是'1'? – Divakar

1

希望這有助於使用np.where

In[49]:df['Power']=np.where((df['Holiday']==1)|(df['Report']==1)|(df['Action']==1),1,df['Power']) 

In[50]:df 
Out[50]: 
    Holiday Report Action Power 
0  0  0  0 1.345 
1  0  0  0 1.345 
2  1  0  0 1.000 
3  0  0  0 1.345 
4  0  0  0 1.345 
5  0  1  0 1.000 
6  0  0  0 1.345 
7  0  1  1 1.000 
8  0  0  0 1.345 
9  0  0  1 1.000