Questa soluzione è più sofisticata in termini di implementazione, ma la trovo molto più pulita in termini di utilizzo ed è sicuramente più generale rispetto alle altre proposte.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Non è necessario scaricare l'intero repository: salvare il file e fare
from where import where as W
dovrebbe bastare. Quindi lo usi in questo modo:
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])
Un esempio di utilizzo leggermente meno stupido:
data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)]
A proposito: anche nel caso in cui tu stia usando solo i colli booleani,
df.loc[W['cond1']].loc[W['cond2']]
può essere molto più efficiente di
df.loc[W['cond1'] & W['cond2']]
perché valuta cond2
solo dove si cond1
trova True
.
NOTA BENE: ho prima dato questa risposta altrove perché non l'avevo visto.
df.query
epd.eval
sembrano adatti per questo caso d'uso. Per informazioni sullapd.eval()
famiglia di funzioni, le loro caratteristiche e i casi d'uso, visitare la valutazione delle espressioni dinamiche in panda usando pd.eval () .