Resumen de tipos de selección

La cantidad de posibilidades que nos ofrece la librería pandas a la hora de extraer información de un dataframe puede resultar un tanto abrumadora. Veamos un resumen de las principales técnicas vistas y qué estamos extrayendo con cada una. En la siguiente lista e representa una etiqueta, i un índice y b un booleano:

Notación Formato Extraemos
df["e"] Serie Columna de etiqueta "e"
df["e1"]["e2"] Escalar Valor de la columna de etiqueta "e1" y fila de etiqueta "e2"
df["e"][i] Escalar Valor de la columna de etiqueta "e" y fila de índice i
df[i1:i2] DataFrame Filas con índices desde i1 hasta i2-1
df["e1":"e2"] DataFrame Filas con etiquetas desde "e1" hasta "e2"
df[["e1", "e2", "e3"]] DataFrame Columnas cuyas etiquetas se incluyen en la lista, en el orden indicado
df[[b1, b2, b3]] DataFrame Filas correspondientes a los booleanos que tomen el valor True
df.get("e") Serie Columna de etiqueta "e" (de forma segura)
df.loc["e"] Serie Fila con etiqueta "e"
df.loc[["e1", "e2", "e3]] DataFrame Filas cuyas etiquetas se incluyen en la lista, en el orden indicado
df.loc["e1":"e2"] DataFrame Filas cuyas etiquetas van desde "e1" hasta "e2"
df.loc[:, "e"] Serie Columna con etiqueta "e"
df.loc[:, ["e1", "e2", "e3]] DataFrame Columnas cuyas etiquetas se incluyen en la lista, en el orden indicado
df.loc[:, "e1":"e2"] DataFrame Columnas cuyas etiquetas van desde "e1" hasta "e2"
df.loc["e1", "e2"] Escalar Valor correspondiente a la fila con etiqueta "e1" y columna con etiqueta "e2"
df.iloc[i] Serie Fila cuyo índice es i
df.iloc[[i1, i2, i3]] DataFrame Filas cuyos índices se incluyen en la lista, en el orden indicado
df.iloc[i1:i2] DataFrame Filas cuyos índices van desde i1 hasta i2-1
df.iloc[:, i] Serie Columna cuyo índice es i
df.iloc[:, [i1, i2, i3]] DataFrame Columnas cuyos índices se incluyen en la lista, en el orden indicado
df.iloc[:, i1:i2] DataFrame Columnas cuyos índices van desde i1 hasta i2-1
df.iloc[i1, i2] Escalar Valor correspondiente a la fila con índice i1 y columna con índice i2

 

No se incluyen en el listado anterior combinaciones de estos métodos ni los métodos para la selección usando índices y etiquetas simultáneamente.

Aunque, a primera vista, pueda parecer bastante confuso, es posible destacar algunas reglas básicas:

  1. Cuando se usan los métodos loc o iloc, el primer argumento siempre hace referencia a filas y el segundo a columnas. Esto significa que si no se incluye el segundo argumento, siempre estaremos extrayendo filas.
  2. El método get devuelve columnas.
  3. Sin incluir los métodos loc, iloc y get, solo hay -en el listado anterior- dos formas de extraer columnas: usando como argumento una etiqueta y usando como argumento una lista de etiquetas.
  4. Del punto anterior extraemos como corolario que cualquier otra notación va a devolver filas (el uso de rangos y el uso de listas de booleanos)

Y, de hecho, si de los cuatro puntos anteriores quitamos los dos primeros por obvios, nos quedan dos reglas muy simples:

  1. El uso de una etiqueta o de una lista de etiquetas devuelve columnas
  2. En otros casos se devuelven filas (rangos de números o de etiquetas, o listas de booleanos)

Y, al respecto del tipo de estructura devuelta (si es un escalar, una serie o un dataframe) también es posible identificar una regla: salvo el caso más obvio en el que estemos extrayendo un valor resultante de la intersección de una fila y una columna, si la nomenclatura que estamos usado permite extraer más de una fila o de una columna (aunque estemos extrayendo solo una en un momento dado) devolverá siempre dataframes y, en caso contrario, series.

Por ejemplo, el uso de rangos permite extraer más de una fila (o de una columna), de forma que su uso siempre devuelve un dataframe. Así, df["e1":"e2"] siempre devolverá un dataframe, aunque en este ejemplo estemos usando el rango para extraer una única columna.

Otro ejemplo: si estamos usando la notación df.loc[:, "e"], estamos extrayendo una columna y solo una columna, y con esta notación (dos puntos para las filas y una etiqueta para columnas) nunca podríamos extraer más de una columna, de forma que el resultado de la extracción siempre será una serie.