Reestructuración de datos de Pandas (pivot / melt / stack / unstack)

La reestructuración de datos es una operación común en el análisis de datos, utilizada para cambiar la estructura de disposición de los datos. Pandas proporciona funciones como pivot, melt, stack, unstack, etc., para lograr la conversión entre formato largo y formato ancho.


pivot Tabla dinámica

pivotConvierte datos de formato largo a formato ancho, similar a la función de tabla dinámica de Excel.

Uso básico

Ejemplo

import pandas as pd

# Crear datos de formato largo
df = pd.DataFrame({
    Fecha: ["2024-01-01", "2024-01-01", "2024-01-02", "2024-01-02"],
    Producto: ["A", "B", "A", "B"],
    Ventas: [100, 150, 120, 90]
})

print(Datos de formato largo:)
print(df)
print()

# Convertir a formato ancho
pivot_df = df.pivot(index=Fecha, columns=Producto, values=Ventas)
print(Datos de formato ancho:)
print(pivot_df)

Índice múltiple

Ejemplo

import pandas as pd

df = pd.DataFrame({
    Año: ["2024", "2024", "2024", "2024"],
    Trimestre: ["Q1", "Q1", "Q2", "Q2"],
    Producto: ["A", "B", "A", "B"],
    Ventas: [100, 150, 120, 90]
})

print(Datos:)
print(df)
print()

# Tabla dinámica de índice múltiple
pivot_df = df.pivot(index=[Año, Trimestre], columns=Producto, values=Ventas)
print(Tabla dinámica de índice múltiple:)
print(pivot_df)

Funciones de agregación

Ejemplo

import pandas as pd

# Caso con valores duplicados
df = pd.DataFrame({
    Fecha: ["2024-01-01", "2024-01-01", "2024-01-01", "2024-01-02"],
    Producto: ["A", "A", "B", "B"],
    Ventas: [100, 110, 80, 90]
})

print(Datos con valores duplicados:)
print(df)
print()

# pivot no admite valores duplicados de forma predeterminada; se debe usar pivot_table y especificar una función de agregación
pivot_df = df.pivot_table(index=Fecha, columns=Producto, values=Ventas, aggfunc="sum")
print(Agregación con sum:)
print(pivot_df)
print()

# Usar mean
print(Agregación con mean:)
print(df.pivot_table(index=Fecha, columns=Producto, values=Ventas, aggfunc="mean"))

pivotNo se permiten valores duplicados; cuando haya valores duplicados, usepivot_tabley especifique una función de agregación.


melt (pivot inverso)

meltConvierte datos de formato ancho a formato largo; es la operación inversa de pivot.

Ejemplo

import pandas as pd

# Crear datos de formato ancho
df = pd.DataFrame({
    Fecha: ["2024-01-01", "2024-01-02"],
    "A": [100, 120],
    "B": [150, 90]
})

print(Datos de formato ancho:)
print(df)
print()

# Convertir a formato largo
melted = df.melt(id_vars=Fecha, var_name=Producto, value_name=Ventas)
print(Datos de formato largo:)
print(melted)

Mantener varias columnas sin cambios

Ejemplo

import pandas as pd

df = pd.DataFrame({
    Ciudad: [Pekín, Shanghái],
    Ingresos 2023: [1000, 800],
    Beneficios 2023: [200, 150],
    Ingresos 2024: [1200, 950],
    Beneficios 2024: [250, 180]
})

print(Formato ancho:)
print(df)
print()

# Mantener la columna 'Ciudad' sin cambios, convertir las demás columnas a formato largo
melted = df.melt(
    id_vars=Ciudad,
    var_name=Indicador,
    value_name=Valor
)
print(Formato largo:)
print(melted)

stack y unstack

stack y unstack son funciones de reestructuración específicas para MultiIndex.

unstack

Ejemplo

import pandas as pd

# Crear datos con índice de múltiples niveles
df = pd.DataFrame({
    "A": [1, 2, 3, 4],
    "B": [5, 6, 7, 8]
}, index=pd.MultiIndex.from_tuples(
    [("X", 1), ("X", 2), ("Y", 1), ("Y", 2)],
    names=[Categoría, Número]
))

print(Datos con índice de múltiples niveles:)
print(df)
print()

# unstack convierte el índice interno en columnas
print(Después de unstack:)
print(df.unstack())

stack

Ejemplo

import pandas as pd

# Crear formato ancho (con índice de columnas)
df = pd.DataFrame({
    ("A", "X"): [1, 2],
    ("A", "Y"): [3, 4],
    ("B", "X"): [5, 6],
    ("B", "Y"): [7, 8]
})

print(Con índice de columnas de múltiples niveles:)
print(df)
print()

# stack convierte el índice de columnas en índice interno
print(Después de stack:)
print(df.stack())

Caso práctico: Transformación de informes de negocio

Ejemplo

import pandas as pd

# Simular datos de negocio - registros de ventas
sales = pd.DataFrame({
    Fecha: ["2024-01"] * 4,
    Producto: [Teléfono móvil, Computadora, Tableta, Auriculares],
    Canal: [En línea, En línea, Fuera de línea, En línea],
    Importe de ventas: [10000, 20000, 8000, 5000]
})

print(Datos de ventas originales:)
print(sales)
print()

# Convertir usando pivot
pivot = sales.pivot_table(
    index=Producto,
    columns=Canal,
    values=Importe de ventas,
    aggfunc="sum",
    fill_value=0
)
print(Tabla dinámica de ventas por canal:)
print(pivot)
print()

# Restaurar a formato largo
print(Restaurado a formato largo:)
print(pivot.reset_index().melt(id_vars=Producto, var_name=Canal, value_name=Importe de ventas))

Selección de funciones de reestructuración

Función Propósito Escenario típico
pivot Largo → Ancho Conversión de filas y columnas
pivot_table Largo → Ancho (con agregación) Cuando hay valores duplicados
melt Ancho → Largo Organización de datos
unstack Índice → Columna Índice de múltiples niveles
stack Columna → Índice Índice de múltiples niveles

El propósito de la reestructuración de datos es hacer que los datos sean más adecuados para el análisis o la presentación. Elija el método de conversión adecuado según las necesidades posteriores.

Otras extensiones