Це рішення є більш хакерським щодо реалізації, але я вважаю його набагато більш чистим у плані використання, і, звичайно, більш загальним, ніж інші запропоновані.
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 () .