Estou filtrando linhas em um dataframe por valores em duas colunas.
Por alguma razão, o operador OR se comporta como eu esperaria que o operador AND se comportasse e vice-versa.
Meu código de teste:
import pandas as pd
df = pd.DataFrame({'a': range(5), 'b': range(5) })
# let's insert some -1 values
df['a'][1] = -1
df['b'][1] = -1
df['a'][3] = -1
df['b'][4] = -1
df1 = df[(df.a != -1) & (df.b != -1)]
df2 = df[(df.a != -1) | (df.b != -1)]
print pd.concat([df, df1, df2], axis=1,
keys = [ 'original df', 'using AND (&)', 'using OR (|)',])
E o resultado:
original df using AND (&) using OR (|)
a b a b a b
0 0 0 0 0 0 0
1 -1 -1 NaN NaN NaN NaN
2 2 2 2 2 2 2
3 -1 3 NaN NaN -1 3
4 4 -1 NaN NaN 4 -1
[5 rows x 6 columns]
Como você pode ver, o AND
operador descarta todas as linhas nas quais pelo menos um valor é igual -1
. Por outro lado, o OR
operador exige que ambos os valores sejam iguais -1
para descartá-los. Eu esperaria exatamente o resultado oposto. Alguém poderia explicar esse comportamento, por favor?
Estou usando pandas 0.13.1.
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 () .