Це рішення є більш хакерським щодо реалізації, але я вважаю його набагато більш чистим у плані використання, і, звичайно, більш загальним, ніж інші запропоновані.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Вам не потрібно завантажувати всю репо: збереження файлу та виконання
from where import where as W
повинно вистачити Тоді ви використовуєте це так:
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])
Трохи менш дурний приклад використання:
data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)]
До речі: навіть у тому випадку, коли ви просто використовуєте булові знаки,
df.loc[W['cond1']].loc[W['cond2']]
може бути набагато ефективнішим, ніж
df.loc[W['cond1'] & W['cond2']]
тому що він оцінює cond2лише те, де cond1єTrue .
ВІДМОВА: Я вперше дав цю відповідь в іншому місці, тому що цього не бачив.
df.queryі,pd.evalздається, добре підходить для цього випадку використання. Для отримання інформації проpd.eval()сімейство функцій, їх особливості та випадки використання, будь ласка, відвідайте Динамічну оцінку вираження в пандах за допомогою pd.eval () .