1. Faro

Nivel 3 · Convierte la hoja de presupuesto en una tabla larga

La solicitud

De Jordan Reyes, Director de Marketing

“Aquí está nuestro plan de presupuesto de 2026, una columna por canal como en mi hoja de cálculo. Datos dice que lo necesitan como una fila por trimestre y canal para cargarlo junto al gasto real. ¿Puedes remodelarlo?”

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 quarter channel budgetpendiente
  • 12 filas, ordenadas como se pidependiente

Tu código

Python

Cargando el editor…

    ResultadoPresiona Ejecutar para ver el tuyo

    Mote revisa tu resultado

    Presiona Ejecutar. Cada fila que cumple el objetivo se vuelve una luciérnaga en tu linterna.

    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 variable y value, 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.

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