Giải pháp này có nhiều hack về mặt thực hiện, nhưng tôi thấy nó sạch sẽ hơn nhiều về mặt sử dụng, và nó chắc chắn là tổng quát hơn so với những người khác đề xuất.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Bạn không cần tải xuống toàn bộ repo: lưu tệp và thực hiện
from where import where as W
nên đủ. Sau đó, bạn sử dụng nó như thế này:
df = pd.DataFrame([[1, 2, True],
[3, 4, False],
[5, 7, True]],
index=range(3), columns=['a', 'b', 'c'])
# On specific column:
print(df.loc[W['a'] > 2])
print(df.loc[-W['a'] == W['b']])
print(df.loc[~W['c']])
# On entire - or subset of a - DataFrame:
print(df.loc[W.sum(axis=1) > 3])
print(df.loc[W[['a', 'b']].diff(axis=1)['b'] > 1])
Một ví dụ sử dụng hơi ngu ngốc:
data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)]
Nhân tiện: ngay cả trong trường hợp bạn chỉ đang sử dụng cols boolean,
df.loc[W['cond1']].loc[W['cond2']]
có thể hiệu quả hơn nhiều
df.loc[W['cond1'] & W['cond2']]
bởi vì nó đánh giá cond2
duy nhất mà cond1
là True
.
TUYÊN BỐ TỪ CHỐI: Lần đầu tiên tôi đưa ra câu trả lời này ở nơi khác vì tôi chưa thấy điều này.
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ềpd.eval()
họ các 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 trong gấu trúc bằng pd.eval () .