Я фільтрую рядки у кадрі даних за значеннями у двох стовпцях.
Чомусь оператор АБО поводиться так, як я очікував, що оператор AND поводитиметься і навпаки.
Мій тестовий код:
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 (|)',])
І результат:
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]
Як бачите, AND
оператор скидає кожен рядок, у якому принаймні одне значення дорівнює -1
. З іншого боку, OR
оператор вимагає, щоб обидва значення були рівними, -1
щоб скинути їх. Я очікував би прямо протилежного результату. Може хтось пояснить цю поведінку, будь ласка?
Я використовую панди 0,13.1.
df.query
і,pd.eval
здається, добре підходить для цього випадку використання. Для отримання інформації проpd.eval()
сімейство функцій, їх особливості та випадки використання, будь ласка, відвідайте Динамічну оцінку вираження в пандах за допомогою pd.eval () .