To rozwiązanie jest bardziej hackowe pod względem implementacji, ale uważam je za znacznie czystsze pod względem użytkowania i jest z pewnością bardziej ogólne niż inne proponowane.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/condition.py
Nie trzeba ściągnąć całą repo: Zapisywanie pliku i robi
from condition import Condition as C
powinno wystarczyć.Następnie użyć go tak:
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])
nieznacznie mniej głupi przykład wykorzystania:
data = pd.read_csv('ugly_db.csv').loc[~(C() == '$null$').any(axis=1)]
Przy okazji: nawet w przypadku, w którym jest tylko przy użyciu logicznych cols,
df.loc[C('cond1')].loc[C('cond2')]
może być znacznie bardziej wydajny niż
df.loc[C('cond1') & C('cond2')]
ponieważ ocenia cond2
tylko tam, gdzie cond1
jest True
.
OŚWIADCZENIE: Najpierw podałem tę odpowiedź elsewhere, ponieważ nie widziałem tego.
Świetna odpowiedź! Więc w '' '(df.A == 1) & (df.D == 6)' '' jest "&" przeciążonym operatorem w Pandach? – Shawn
Rzeczywiście, zobacz także http://pandas.pydata.org/pandas-docs/stable/indexing.html?#boolean-operators –
To jest naprawdę fajne rozwiązanie - nie wiedziałem nawet, że możesz zastosować metody jury-rig tak jak w pytonie. Taka funkcja byłaby naprawdę przyjemna w Pandas. – naught101