2017-08-25 3 views
2

2つの列のTrue値と前の2行のテストを実行しています。本質的にどちらかの列が真または前の2つの値がtrueを返す必要があります。Pandasの複数の行と列のブール演算

私はそれが動作しますが、これで作ってみた:

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

関連する問題