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ć, AND
operator porzuca każdy wiersz, w którym przynajmniej jedna wartość jest równa -1
. Z drugiej strony OR
operator wymaga, aby obie wartości były równe, aby -1
je usunąć. Spodziewałbym się dokładnie odwrotnego wyniku. Czy ktoś mógłby wyjaśnić to zachowanie?
Używam pand 0.13.1.
df.query
ipd.eval
wydaje 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 () .