Solución

Pandas

Vista general

El problema requiere remodelar un DataFrame dado que captura la información de ventas de los productos en diferentes trimestres. Inicialmente, la información está estructurada en un formato ancho, donde cada producto tiene columnas separadas para las ventas de cada trimestre. El objetivo es transformar esta información en un formato largo, donde cada fila representa la información de ventas para un producto específico en un trimestre particular, efectivamente consolidando las columnas multiples de los trimestres en dos columnas: una indicando el trimestre y la otra detallando las ventas para ese trimestre.

Conceptos clave

  • Función melt: La función melt de pandas se utiliza para transformar o remodelar información. Esta cambia el DataFrame de un formato ancho, donde las columnas representan multiples variables, a un formato largo, donde cada fila representa una variable única. EN nuestro caso, queremos transformar la información de ventas de tener columnas separadas para cada trimestre a un formato donde hay una única columna para cada trimestre y una única columna para cada venta.

  • Argumentos de la función melt:

    • id_vars: Este argumento especifica las columnas que deben permanecer sin cambios. Para este problema, solo la columna product permanece sin cambios porque queremos que cada fila del resultado se asocie a cada producto.
    • value_vars: Este argumento especifica las columnas que queremos “fusionar” o remodelar en filas. En nuestro caso, son las columnas de las ventas para cada trimestre: quarter_1, quarter_2, quarter_3, y quarter_4.
    • var_name: Este argumento es el nombre de la nueva columna que almacenará los encabezados de los value_vars. En nuestro problema, esos son los nombres de los trimestres.
    • value_name: Este es el nombre de la nueva columna que almacenará los valores de los value_vars. En nuestro problema, serán los totales de ventas de cada producto en cada trimestre.

Intuición

Utilizando el ejemplo dado:

product quarter_1 quarter_2 quarter_3 quarter_4
Umbrella 417 224 379 611
SleepingBag 800 936 93 875
  1. id_vars=['product'] contiene la columna product sin cambios.
  2. value_vars=['quarter_1', ..., 'quarter_4' significa que estamos tomando la información de esas columnas y remodelandola en dos nuevas columnas.
  3. var_name='quarter' creará una nueva columnas llamada quarter, y cada entrada será nombre de la columna de deonde la información de ventas fue tomada (por ejemplo, quarter_1, quarter_2, etc.).
  4. value_name='sales' creará una nueva columna llamada sales, la cual almacenará los valores de las ventas.

Al aplicar la función melt, el DataFrame se remodela al formato largo deseado.

Utilizando la Solución

Visualizando la función melt
reshape data melt fig1

Cuando pasamos el siguiente DataFrame a la función:

product quarter_1 quarter_2 quarter_3 quarter_4
Umbrella 417 224 379 611
SleepingBag 800 936 93 875

Nos retornará:

product quarter sales
Umbrella quarter_1 417
SleepingBag quarter_1 800
Umbrella quarter_2 224
SleepingBag quarter_2 936
Umbrella quarter_3 379
SleepingBag quarter_3 93
Umbrella quarter_4 611
SleepingBag quarter_4 875

Implementación

import pandas as pd


def meltTable(report: pd.DataFrame) -> pd.DataFrame:
    value_vars = [
        "quarter_1",
        "quarter_2",
        "quarter_3",
        "quarter_4"
    ]
    report = report.melt(
        id_vars=["product"],
        value_vars=value_vars,
        var_name="quarter",
        value_name="sales",
    )
    return report

slackmart blog © 2024