1. Faro

Nivel 4 · ¿Series o DataFrame?

La solicitud

De Priya Shah, Directora de Datos

“Una comprobación rápida antes de que empieces a construir informes, porque esto hace tropezar a todo el mundo en su primera semana.”

Tu objetivo

Elige la afirmación que es verdadera.

¿Cuál de estas afirmaciones es verdadera sobre `orders["status"]` y `orders[["status"]]`?

Elige una respuesta y luego compruébala.

La lección

Por qué importa esta distinción

pandas tiene dos objetos principales, y casi todos los errores confusos de tus primeras semanas vienen de tener uno cuando esperabas el otro.

Una Series es una columna: valores más un índice. Tiene un solo dtype y un name (el nombre de la columna). Las Series tienen métodos para trabajar con valores, como .value_counts(), .unique(), .str.lower(), .dt.year, .map() y .between().

Un DataFrame es una tabla de una o más columnas que comparten un índice. Los DataFrames tienen métodos para trabajar con tablas, como .merge(), .groupby() con varias columnas, .sort_values(by=...), .drop_duplicates(subset=...) y .to_csv().

La regla

orders["status"]             # Series
orders[["status"]]           # DataFrame, 1 column
orders[["status", "channel"]]   # DataFrame, 2 columns

Los corchetes interiores crean una lista de Python. Siempre que seleccionas con una lista, obtienes un DataFrame, aunque la lista contenga un solo nombre.

Comprobar lo que tienes

En caso de duda, pregúntale a Python:

type(orders["status"])       # pandas.core.series.Series
type(orders[["status"]])     # pandas.core.frame.DataFrame
orders[["status"]].shape     # (12000, 1)
orders["status"].shape       # (12000,)   one dimension only

El shape es un buen indicador: una Series tiene un shape de un elemento, un DataFrame siempre tiene dos.

Un modelo mental útil

Piensa en un DataFrame como un diccionario de Series que comparten el mismo índice. Pedir una clave (orders["status"]) te entrega esa Series. Pedir con una lista de claves te entrega un diccionario más pequeño, que sigue siendo un DataFrame. Esto también explica por qué añadir una columna se parece a añadir una clave de diccionario: orders["is_web"] = orders["channel"] == "web".

Convertir entre ellos

orders[["status"]].squeeze()        # one-column DataFrame to Series
orders["status"].to_frame()         # Series to one-column DataFrame

Dónde da problemas

  • orders[["status"]].value_counts() funciona, pero devuelve conteos indexados por un MultiIndex de un nivel, que se imprime y se une de forma distinta a orders["status"].value_counts().
  • Los accesores .str y .dt existen solo en las Series.
  • Asignar una columna nueva necesita una Series (o una lista o un solo valor) en el lado derecho, no un DataFrame.
  • Muchos resultados de agregación son Series. orders.groupby("channel")["shipping_fee"].mean() es una Series indexada por canal; añade .reset_index() para convertirla en una tabla de dos columnas.

Acertar con esto también hace fáciles de seguir los enunciados de las tareas de este juego: cuando un nivel pide una Series, devuelve los valores de una columna; cuando pide un DataFrame con columnas con nombre, devuelve una tabla con exactamente esas columnas.

Elige qué puede ejecutarse en este sitio. Puedes cambiarlo cuando quieras desde "Configurar cookies", al pie de cada página.