tutorial tablas seleccionar notebook libreria español documentacion datos con columnas cargar python pandas boolean-logic

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'')