Это решение более хакерское с точки зрения реализации, но я нахожу его более чистым с точки зрения использования, и он, безусловно, более общий, чем другие предлагаемые.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/condition.py
Вам не нужно загружать весь репозиторий: сохранение файла и делает
from condition import Condition as C
должно хватить.Затем вы используете это так:
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[C('a') > 2])
print(df.loc[-C('a') == C('b')])
print(df.loc[~C('c')])
# On entire DataFrame:
print(df.loc[C().sum(axis=1) > 3])
print(df.loc[C(['a', 'b']).diff(axis=1)['b'] > 1])
чуть менее глупый пример использования:
data = pd.read_csv('ugly_db.csv').loc[~(C() == '$null$').any(axis=1)]
Кстати: даже в том случае, когда вы только с помощью логической CO,
df.loc[C('cond1')].loc[C('cond2')]
может быть намного более эффективным, чем
df.loc[C('cond1') & C('cond2')]
потому что он оценивает cond2
только там, где cond1
является True
.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я впервые дал этот ответ elsewhere, потому что я этого не видел.
Отличный ответ! Итак, в '' '(df.A == 1) & (df.D == 6)' '', является ли «&» перегруженным оператором в Pandas? – Shawn
действительно см. Также http://pandas.pydata.org/pandas-docs/stable/indexing.html?#boolean-operators –
Это действительно приятное решение - я даже не знал, что вы можете использовать методы присяжных как в python. Подобную функцию было бы очень приятно иметь в самой Панде. – naught101