python pandas dataframe conditional

python - Los pandas seleccionan filas y columnas según la condición booleana



dataframe conditional (1)

Tengo un marco de datos de pandas con aproximadamente 50 columnas y> 100 filas. Quiero seleccionar las columnas ''col_x'' , ''col_y'' donde ''col_z'' < m . ¿Hay una manera simple de hacer esto, similar a df[df[''col3''] < m] y df[[''colx'',''coly'']] pero combinados?


Analicemos tu problema. Tú quieres

  1. Filtrar filas según alguna condición booleana
  2. Desea seleccionar un subconjunto de columnas del resultado.

Para el primer punto, la condición que necesitaría es:

df["col_z"] < m

Para el segundo requisito, desearía especificar la lista de columnas que necesita:

["col_x", "col_y"]

¿Cómo combinarías estos dos para producir un resultado esperado con pandas? La forma más sencilla es usar loc -

df.loc[df["col_z"] < m, ["col_x", "col_y"]]

El primer argumento selecciona filas y el segundo argumento selecciona columnas.

Más acerca de loc

Piense en esto en términos de las operaciones de álgebra relacional: selección y proyección . Si eres del mundo SQL, este sería un equivalente relacionado. La operación anterior, en sintaxis SQL, se vería así:

SELECT col_x, col_y # projection on columns FROM df WHERE col_z < m # selection on rows

pandas loc le permite especificar etiquetas de índice para seleccionar filas. Por ejemplo, si tiene un marco de datos:

col_x col_y a 1 4 b 2 5 c 3 6

Para seleccionar el índice a , c , y col_x :

df.loc[[''a'', ''c''], [''col_x'']] col_x a 1 c 3

Alternativamente, para seleccionar por una condición booleana (usando una serie / matriz de valores bool , como lo hace su pregunta original), donde todos los valores en col_x son impares -

df.loc[(df.col_x % 2).ne(0), [''col_y'']] col_y a 4 c 6

Para más detalles, df.col_x % 2 calcula el módulo de cada valor con respecto a 2 . El ne(0) luego comparará el valor con 0 y devolverá True si no lo está (todos los números impares se seleccionan así). Esto es lo que da como resultado esa expresión:

(df.col_x % 2).ne(0) a True b False c True Name: col_x, dtype: bool

Otras lecturas