python - tablas - seleccionar columnas en pandas
pandas: múltiples condiciones al indexar el marco de datos-comportamiento inesperado (2)
Como puede ver, el operador AND descarta cada fila en la que al menos un valor es igual a -1. Por otro lado, el operador OR requiere que ambos valores sean igual a -1 para soltarlos.
Está bien. Recuerde que está escribiendo la condición en términos de lo que desea conservar , no en términos de lo que desea eliminar. Para df1
:
df1 = df[(df.a != -1) & (df.b != -1)]
Usted está diciendo "mantener las filas en las que df.a
no es -1 y df.b
no es -1", que es lo mismo que soltar cada fila en la que al menos un valor es -1.
Para df2
:
df2 = df[(df.a != -1) | (df.b != -1)]
Usted está diciendo "mantener las filas en las que df.a
o df.b
no es -1", que es lo mismo que dejar filas donde ambos valores son -1.
PD: el acceso encadenado como df[''a''][1] = -1
puede meterlo en problemas. Es mejor adquirir el hábito de usar .loc
y .iloc
.
Estoy filtrando filas en un marco de datos por valores en dos columnas.
Por alguna razón, el operador OR se comporta como esperaría que el operador AND se comporte 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 operador AND
descarta cada fila en la que al menos un valor es igual a -1
. Por otro lado, el operador OR
requiere que ambos valores sean igual a -1
para soltarlos. Yo esperaría exactamente el resultado opuesto. ¿Alguien podría explicar este comportamiento, por favor?
Estoy usando pandas 0.13.1.
Puede usar query() , es decir:
df_filtered = df.query(''a == 4 & b != 2'')