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 ANDoperador descarta cada fila en la que al menos un valor es igual -1. Por otro lado, el ORoperador requiere que ambos valores sean iguales -1para descartarlos. Esperaría exactamente el resultado opuesto. ¿Alguien podría explicar este comportamiento, por favor?
Estoy usando pandas 0.13.1.
df.queryypd.evalparece 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 () .