Tôi đang lọc các hàng trong khung dữ liệu theo các giá trị trong hai cột.
Vì một số lý do mà toán tử OR hoạt động như tôi mong đợi toán tử AND sẽ hoạt động và ngược lại.
Mã thử nghiệm của tôi:
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 (|)',])
Và kết quả:
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]
Như bạn có thể thấy, AND
toán tử giảm mỗi hàng có ít nhất một giá trị bằng -1
. Mặt khác, OR
toán tử yêu cầu cả hai giá trị bằng nhau -1
để loại bỏ chúng. Tôi sẽ mong đợi chính xác kết quả ngược lại. Bất cứ ai có thể giải thích hành vi này, xin vui lòng?
Tôi đang sử dụng gấu trúc 0.13.1.
df.query
vàpd.eval
có vẻ như phù hợp với trường hợp sử dụng này. Để biết thông tin về nhómpd.eval()
hàm, tính năng và trường hợp sử dụng của chúng, vui lòng truy cập Đánh giá biểu thức động ở gấu trúc bằng pd.eval () .