To rozwiązanie jest bardziej hackerskie pod względem implementacji, ale uważam, że jest o wiele czystsze pod względem użytkowania, a na pewno jest bardziej ogólne niż inne proponowane.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Nie musisz pobierać całego repo: zapisywanie pliku i robienie
from where import where as W
powinno wystarczyć. Następnie używasz go w następujący sposób:
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])
Nieco głupszy przykład użycia:
data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)]
Nawiasem mówiąc: nawet w przypadku, gdy używasz tylko logicznej kolumny,
df.loc[W['cond1']].loc[W['cond2']]
może być znacznie bardziej wydajny niż
df.loc[W['cond1'] & W['cond2']]
ponieważ ocenia cond2
tylko, gdzie cond1
jest True
.
ZASTRZEŻENIE: Najpierw udzieliłem tej odpowiedzi gdzie indziej, ponieważ jej nie widziałem.
df.query
ipd.eval
wydają się pasować do tego przypadku użycia. Aby uzyskać informacje na tematpd.eval()
rodziny funkcji, ich funkcji i przypadków użycia, odwiedź stronę Dynamic Expression Evaluation w pandach za pomocą pd.eval () .