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:
- 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.
- El método get devuelve columnas.
- 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.
- 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:
- El uso de una etiqueta o de una lista de etiquetas devuelve columnas
- 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.