Solusi ini lebih bersifat meretas dalam hal implementasi, tetapi saya merasa jauh lebih bersih dalam hal penggunaan, dan tentu saja lebih umum daripada yang lain yang diusulkan.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Anda tidak perlu mengunduh seluruh repo: menyimpan file dan melakukan
from where import where as W
harus cukup. Maka Anda menggunakannya seperti ini:
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])
Contoh penggunaan yang sedikit kurang bodoh:
data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)]
Omong-omong: bahkan dalam kasus di mana Anda hanya menggunakan boolean cols,
df.loc[W['cond1']].loc[W['cond2']]
dapat jauh lebih efisien daripada
df.loc[W['cond1'] & W['cond2']]
karena mengevaluasi cond2
hanya mana cond1
adalah True
.
DISCLAIMER: Saya pertama kali memberikan jawaban ini di tempat lain karena saya belum melihat ini.
df.query
danpd.eval
sepertinya cocok untuk kasus penggunaan ini. Untuk informasi tentang rangkaianpd.eval()
fungsi, fitur dan kasingnya , silakan kunjungi Evaluasi Ekspresi Dinamis di panda menggunakan pd.eval () .