La solicitud

De Jordan Reyes, Director de Marketing
Tu objetivo
Remodela plan en un DataFrame con las columnas quarter, channel y budget: una fila por trimestre y canal (12 filas), ordenado por quarter y luego por channel de la A a la Z, con el índice reiniciado de 0 a 11.
- Muestra exactamente
quarterchannelbudgetpendiente - 12 filas, ordenadas como se pidependiente
Tu código
Cargando el editor…
Solución de referencia
Mote revisa tu resultado
Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.
Lo que recibe Jordan, y por qué
La lección
Por qué las hojas anchas necesitan melt
La gente construye las hojas de cálculo anchas: una fila por periodo, una columna por canal, porque
es fácil de leer y de teclear. El código las prefiere largas: una fila por periodo y canal,
con el canal guardado como un valor en una columna. Una tabla larga puede agruparse por canal,
unirse con el gasto real por trimestre y canal, filtrarse con == "paid" y graficarse con una línea
por canal. Una ancha necesita una línea de código distinta para cada columna.
melt es la herramienta que va de ancho a largo. Es la inversa de pivot_table.
La sintaxis
wide.melt(
id_vars="quarter", # columns that identify a row and stay as they are
var_name="channel", # name for the column that will hold the old column names
value_name="budget", # name for the column that will hold the cell values
)
Toda columna que no esté en id_vars se convierte. Si solo quieres algunas, lístalas en
value_vars=[...]. Sin var_name y value_name, pandas llama a las columnas nuevas variable y
value, que luego tendrías que renombrar.
El número de filas es fácil de predecir: filas × columnas convertidas. Una hoja de 4 filas con 3
columnas de canal pasa a 12 filas. Compruébalo con len() después de aplicar melt.
Un ejemplo trabajado: gasto por año
Aquí está el gasto anual de marketing como una cuadrícula ancha, del tipo que obtendrías de un pivot o de una hoja de cálculo:
spend = marketing_spend.assign(year=marketing_spend["spend_date"].dt.year)
wide = spend.pivot_table(index="year", columns="channel",
values="amount", aggfunc="sum").round(2).reset_index()
# channel year email paid social
# 0 2023 28989.02 253948.40 99253.03
# ...
long = wide.melt(id_vars="year", var_name="channel", value_name="amount")
# year channel amount
# 0 2023 email 28989.02
# 1 2024 email 32876.47
# 2 2025 email 38322.22
# 3 2023 paid 253948.40
# ... (9 rows)
Fíjate en el .reset_index() antes de aplicar melt: melt solo ve columnas normales, así que
year debe ser una columna, no el índice, para conservarse como identificador.
Orden de filas tras un melt
melt apila las columnas convertidas una tras otra: todas las filas de email, luego todas las de
paid, luego social. Rara vez es el orden que quieres mostrar, así que ordena después y reinicia el índice:
long.sort_values(["year", "channel"]).reset_index(drop=True)
Errores comunes
- Olvidar
id_vars. El identificador se convierte junto con las medidas y sus etiquetas acaban en la columna de valores. - Aplicar melt a una tabla cuyo identificador sigue siendo el índice. Llama antes a
.reset_index(). - Dejar los nombres por defecto
variableyvalue, que no significan nada para el siguiente lector. - Esperar el orden original de las filas. Las filas convertidas salen agrupadas por la columna antigua; ordénalas.
¡Linterna encendida!
Practicaste: meltlong formatid varsvar namevalue name
- Resuelto
- Sin pistas
- Al primer intento
