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 cond2
apenas onde cond1
estáTrue
.
AVISO LEGAL: Eu dei essa resposta pela primeira vez em outro lugar porque não tinha visto isso.
df.query
epd.eval
parece 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 () .