Cette solution est plus hackeuse en terme d'implémentation, mais je la trouve beaucoup plus propre en terme d'utilisation, et elle est certainement plus générale que les autres proposées.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Vous n'avez pas besoin de télécharger l'intégralité du référentiel: enregistrer le fichier et faire
from where import where as W
devrait suffire. Ensuite, vous l'utilisez comme ceci:
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 exemple d'utilisation un peu moins stupide:
data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)]
Soit dit en passant: même dans le cas où vous utilisez simplement des cols booléens,
df.loc[W['cond1']].loc[W['cond2']]
peut être beaucoup plus efficace que
df.loc[W['cond1'] & W['cond2']]
car il évalue cond2
uniquement où cond1
est True
.
AVERTISSEMENT: J'ai d'abord donné cette réponse ailleurs parce que je ne l'avais pas vu.
df.query
etpd.eval
semblent être de bons ajustements pour ce cas d'utilisation. Pour plus d'informations sur lapd.eval()
famille de fonctions, leurs fonctionnalités et leurs cas d'utilisation, veuillez consulter Évaluation des expressions dynamiques dans les pandas à l'aide de pd.eval () .