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 cond1
está True
.
DESCARGO DE RESPONSABILIDAD: Primero di esta respuesta en otro lugar porque no había visto esto.
df.query
ypd.eval
parece 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 () .