Saya memfilter baris dalam kerangka data dengan nilai dalam dua kolom.
Untuk beberapa alasan operator OR berperilaku seperti yang saya harapkan dari operator AND dan sebaliknya.
Kode tes saya:
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 (|)',])
Dan hasilnya:
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]
Seperti yang Anda lihat, AND
operator menjatuhkan setiap baris di mana setidaknya satu nilai sama -1
. Di sisi lain, OR
operator mengharuskan kedua nilai sama -1
untuk menjatuhkannya. Saya mengharapkan hasil yang justru sebaliknya. Adakah yang bisa menjelaskan perilaku ini?
Saya menggunakan panda 0.13.1.
df.query
danpd.eval
sepertinya cocok untuk kasus penggunaan ini. Untuk informasi tentangpd.eval()
keluarga fungsi, fitur dan kasus penggunaannya, silakan kunjungi Evaluasi Ekspresi Dinamis di pandas menggunakan pd.eval () .