Esta solución es más agresiva en términos de implementación, pero me parece mucho más limpia en términos de uso, y ciertamente es más general que las otras propuestas.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
No necesita descargar el repositorio completo: guardar el archivo y hacer
from where import where as W
Debería ser suficiente. Entonces lo usas así:
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 ejemplo de uso un poco menos estúpido:
data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)]
Por cierto: incluso en el caso de que solo estés usando col booleanos,
df.loc[W['cond1']].loc[W['cond2']]
puede ser mucho más eficiente que
df.loc[W['cond1'] & W['cond2']]
porque evalúa cond2 dónde cond1está True.
DESCARGO DE RESPONSABILIDAD: Primero di esta respuesta en otro lugar porque no había visto esto.
df.queryypd.evalparece que encaja bien en este caso de uso. Para obtener información sobre lapd.eval()familia de funciones, sus características y casos de uso, visite Evaluación de expresión dinámica en pandas usando pd.eval () .