Essa solução é mais imprudente em termos de implementação, mas acho muito mais limpa em termos de uso, e certamente é mais geral do que as outras propostas.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Você não precisa baixar o repositório inteiro: salvando o arquivo e fazendo
from where import where as W
deve ser suficiente. Então você o usa assim:
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])
Um exemplo de uso um pouco menos estúpido:
data = pd.read_csv('ugly_db.csv').loc[~(W == '$null$').any(axis=1)]
A propósito: mesmo no caso em que você está apenas usando colunas booleanas,
df.loc[W['cond1']].loc[W['cond2']]
pode ser muito mais eficiente do que
df.loc[W['cond1'] & W['cond2']]
porque avalia cond2apenas onde cond1estáTrue .
AVISO LEGAL: Eu dei essa resposta pela primeira vez em outro lugar porque não tinha visto isso.
df.queryepd.evalparece ser um bom ajuste para este caso de uso. Para obter informações sobre apd.eval()família de funções, seus recursos e casos de uso, visite Avaliação de Expressão Dinâmica em pandas usando pd.eval () .