Ich filtere Zeilen in einem Datenrahmen nach Werten in zwei Spalten.
Aus irgendeinem Grund verhält sich der OR-Operator so, wie ich es von einem AND-Operator erwarten würde und umgekehrt.
Mein Testcode:
import pandas as pd
df = pd.DataFrame({'a': range(5), 'b': range(5) })
# let's insert some -1 values
df['a'][1] = -1
df['b'][1] = -1
df['a'][3] = -1
df['b'][4] = -1
df1 = df[(df.a != -1) & (df.b != -1)]
df2 = df[(df.a != -1) | (df.b != -1)]
print pd.concat([df, df1, df2], axis=1,
keys = [ 'original df', 'using AND (&)', 'using OR (|)',])
Und das Ergebnis:
original df using AND (&) using OR (|)
a b a b a b
0 0 0 0 0 0 0
1 -1 -1 NaN NaN NaN NaN
2 2 2 2 2 2 2
3 -1 3 NaN NaN -1 3
4 4 -1 NaN NaN 4 -1
[5 rows x 6 columns]
Wie Sie sehen können, löscht der ANDOperator jede Zeile, in der mindestens ein Wert gleich ist -1. Andererseits ORverlangt der Bediener, dass beide Werte gleich sind -1, um sie fallen zu lassen. Ich würde genau das Gegenteil erwarten. Könnte jemand dieses Verhalten bitte erklären?
Ich benutze Pandas 0.13.1.
df.queryundpd.evalscheinen gut für diesen Anwendungsfall zu passen. Informationen zurpd.eval()Funktionsfamilie, ihren Funktionen und Anwendungsfällen finden Sie unter Auswertung dynamischer Ausdrücke in Pandas mit pd.eval () .