Это решение более хакерское с точки зрения реализации, но я считаю, что оно намного чище с точки зрения использования, и оно, безусловно, более общее, чем другие предложенные.
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()
семействе функций, их функциях и сценариях использования, пожалуйста, посетите Dynamic Expression Evaluation в pandas, используя pd.eval () .