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 AND
Operator jede Zeile, in der mindestens ein Wert gleich ist -1
. Andererseits OR
verlangt 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.query
undpd.eval
scheinen 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 () .