Filtruję wiersze w ramce danych według wartości w dwóch kolumnach.
Z jakiegoś powodu operator OR zachowuje się tak, jak powinienem oczekiwać operatora AND i odwrotnie.
Mój kod testowy:
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 (|)',])
A wynik:
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]
Jak widać, ANDoperator porzuca każdy wiersz, w którym przynajmniej jedna wartość jest równa -1. Z drugiej strony ORoperator wymaga, aby obie wartości były równe, aby -1je usunąć. Spodziewałbym się dokładnie odwrotnego wyniku. Czy ktoś mógłby wyjaśnić to zachowanie?
Używam pand 0.13.1.
df.queryipd.evalwydaje się, że dobrze pasuje do tego przypadku użycia. Aby uzyskać informacje na tematpd.eval()rodziny funkcji, ich funkcji i przypadków użycia, odwiedź stronę Dynamic Expression Evaluation w pandach przy użyciu pd.eval () .