2017-08-25 1 views
2

Ich führe einen Test auf True-Werte in zwei Spalten und den vorherigen zwei Zeilen durch - im Wesentlichen, wenn eine der beiden Spalten wahr ist oder die beiden vorherigen Werte true zurückgeben.Boolesche Operationen über mehrere Zeilen und Spalten hinweg in Pandas

Ich habe mit dieser kommen, das funktioniert:

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)) 

aber es ist so inelegent - es muss ein besserer Weg, dies zu tun ...

+2

Für Start '== true' überflüssig wird. – zipa

+0

ja ich fühle mich wie ein Idiot ... – gdnaes

Antwort

0

es nicht wert sein kann (rechen/Speicher-weise), aber wenn Ihr Code Ihren Stolz verletzt und hält Sie nachts, können Sie dies versuchen:

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') 

Sie jetzt eine zusätzliche Spalte in Daten haben sollten, die Sie überprüfen können gegen. Wie ich schon sagte, ist es möglicherweise nicht effizient, es sei denn, Sie haben sehr große Datensätze, oder Sie haben sehr viele Bedingungen, die Sie verfolgen müssen.

Sie können auch die Voraussetzungen für eine andere Analyse speichern, wenn Sie (Merkmalsauswahl, Clustering, etc.) müssen

+0

Das ist toll, danke! – gdnaes

Verwandte Themen