Estoy filtrando filas en un marco de datos por valores en dos columnas.
Por alguna razón, el operador OR se comporta como yo esperaría que el operador AND se comportara y viceversa.
Mi código de prueba:
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 (|)',])
Y el 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 puede ver, el AND
operador descarta cada fila en la que al menos un valor es igual -1
. Por otro lado, el OR
operador requiere que ambos valores sean iguales -1
para descartarlos. Esperaría exactamente el resultado opuesto. ¿Alguien podría explicar este comportamiento, por favor?
Estoy usando pandas 0.13.1.
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 () .