2017-08-25 38 views
2

我對兩列和前兩行的True值進行測試 - 實質上如果任一列爲true或前兩個值如果應該返回true。熊貓中的多個行和列的布爾運算

我來到了這個,那個作品:

Data['BS Buy Flag']=((Data['DivDown']==True) | (Data['DivDown'].shift(1)==True) | (Data['DivDown'].shift(2)==True) | (Data['KelknerDown']==True) | (Data['KelknerDown'].shift(1)==True) | (Data['KelknerDown'].shift(2)==True)) 

但它是如此inelegent - 必須有這樣做的更好的辦法...

+2

開始'== True'是多餘的。 – zipa

+0

是的,我覺得自己像個白癡...... – gdnaes

回答

0

可能不值得(計算/內存明智),但是如果你的代碼會傷害你的驕傲,並讓你徹夜難眠,你可以試試這個:

df_list = [Data['DivDown'], 
      Data['DivDown'].shift(1), 
      Data['DivDown'].shift(2), 
      Data['KelknerDown'], 
      Data['KelknerDown'].shift(1), 
      Data['KelknerDown'].shift(2)] 

# Create a new df using df_list, preserving index 
check_df = reduce(lambda x, y, pd.merge(x.to_frame(), y.to_frame(), left_index=True, right_index=True), df_list) 

# Write over check_df with result 
check_df = check_df.any(axis=1) # Returns True if any value in a row is True 

# Merge check_df to original data 
Data = pd.merge(check_df.to_frame(), Data, left_index=True, right_index=True, how='inner') 

您現在應該有數據的附加列,您可以覈對。就像我說的,除非你有非常龐大的數據集,否則它可能不是有效的,或者你有很多條件需要跟蹤。

如果需要,您還可以存儲其他分析的條件(功能選擇,羣集等)

+0

非常感謝你! – gdnaes