0Pricing
Pandas & NumPy Academy · Lección

stack y unstack con MultiIndex

Gire el nivel de columnas más interno al índice de filas con stack() y revierta la operación con unstack().

stack y unstack con MultiIndex es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

Introducción a stack y unstack

stack() y unstack() son herramientas de Pandas para cambiar la forma de los datos, trasladándolos entre el índice de filas y el índice de columnas. Resultan especialmente útiles al trabajar con DataFrames que tienen un MultiIndex en cualquiera de los dos ejes. stack() toma el nivel más interno de las columnas y lo convierte en el nivel más interno de las filas, mientras que unstack() hace lo contrario.

stack(): de columnas a filas

DataFrame.stack() transforma el nivel más interno de las etiquetas de columna en el nivel más interno del índice de filas, y produce un resultado más largo y estrecho. Si el DataFrame original tenía columnas simples (sin MultiIndex), el resultado es una Serie con un MultiIndex. Si las columnas tenían varios niveles, stack() reduce en uno el número de niveles de las columnas.

import pandas as pd

df = pd.DataFrame({
    'Math': [85, 90, 78],
    'Science': [92, 88, 95]
}, index=['Alice', 'Bob', 'Carol'])

print(df)
#        Math  Science
# Alice    85       92
# Bob      90       88
# Carol    78       95

stacked = df.stack()
print(stacked)
# Alice    Math       85
#          Science    92
# Bob      Math       90
#          Science    88
# Carol    Math       78
#          Science    95
# dtype: int64

unstack(): de filas a columnas

Series.unstack() (o DataFrame.unstack()) es la operación inversa de stack(). Toma el nivel más interno del índice de filas y lo convierte en nuevas etiquetas de columna, produciendo un resultado más ancho. Funcionalmente, es similar a pivot(), pero trabaja directamente sobre el índice en lugar de hacerlo sobre los valores de las columnas.

stacked = df.stack()
print(type(stacked))  # Series with MultiIndex

# Restore the original wide format
df_restored = stacked.unstack()
print(df_restored)
#        Math  Science
# Alice    85       92
# Bob      90       88
# Carol    78       95

# Identical to the original df!

Seleccionar el nivel que se va a apilar

En los DataFrames con un MultiIndex en las columnas, stack(level) permite elegir qué nivel se debe transformar. Puede pasar un número de nivel (0 para el más externo, -1 para el más interno, que es el predeterminado) o el nombre de un nivel. Del mismo modo, unstack(level) selecciona qué nivel del índice de filas se convertirá en columnas. Este control detallado es esencial para trabajar con estructuras de datos jerárquicas complejas.

# MultiIndex columns
arrays = [['Math', 'Math', 'Science', 'Science'],
          ['Q1', 'Q2', 'Q1', 'Q2']]
multi_cols = pd.MultiIndex.from_arrays(arrays, names=['subject', 'quarter'])

df_multi = pd.DataFrame([[85, 90, 92, 88], [78, 80, 95, 91]],
                        index=['Alice', 'Bob'], columns=multi_cols)

# Stack the 'quarter' level (innermost, level=-1)
print(df_multi.stack(level='quarter').head())

unstack() en niveles específicos de las filas

Cuando el DataFrame tiene un MultiIndex en las filas (algo habitual después de aplicar groupby() a varias columnas), puede usar unstack() en un nivel de fila específico para distribuirlo entre las columnas. Este es un patrón muy común para crear resúmenes con formato de tabla de contingencia sin llamar explícitamente a pivot_table().

# GroupBy produces MultiIndex rows
df2 = pd.DataFrame({
    'region': ['East', 'East', 'West', 'West'],
    'product': ['A', 'B', 'A', 'B'],
    'sales': [100, 150, 120, 200]
})

# MultiIndex result from groupby
multi = df2.groupby(['region', 'product'])['sales'].sum()
print(multi)

# Unstack the product level into columns
wide = multi.unstack('product')
print(wide)
# product    A    B
# region
# East     100  150
# West     120  200

Gestión de valores faltantes en stack/unstack

Cuando se llama a unstack() y no existe cada combinación del índice de filas para todos los niveles de columna, Pandas rellena las celdas faltantes con NaN. Por el contrario, stack() descarta de forma predeterminada las filas que contienen únicamente NaN. Puede controlar este comportamiento con el parámetro dropna: pase stack(dropna=False) para conservar las filas con NaN.

# Incomplete data: West has no product B
df3 = df2[df2['product'] != 'B'].copy()
multi3 = df3.groupby(['region', 'product'])['sales'].sum()

wide3 = multi3.unstack('product', fill_value=0)
print(wide3)
# product    A    B
# region
# East     100    0  <- B filled with 0 instead of NaN
# West     120    0

stack() y después calcular sobre las filas

Un patrón muy útil consiste en aplicar stack() a un DataFrame ancho para convertir las columnas en filas, aplicar una operación por filas, como un filtrado o un groupby, y después usar unstack() para volver al formato ancho. Esto evita tener que escribir bucles columna por columna y mantiene el código vectorizado y legible. Resulta especialmente útil para aplicar simultáneamente la misma transformación a todas las columnas.

# Normalise each column by its column mean using stack/compute/unstack
normalised = (
    df.stack()
      .groupby(level=1)
      .transform(lambda s: (s - s.mean()) / s.std())
      .unstack()
)
print(normalised.round(2))
#        Math  Science
# Alice  0.0     0.39
# Bob    1.13   -1.09
# Carol -1.13    0.71

stack() para crear gráficos

Al igual que melt(), stack() convierte los datos al formato largo, que es el que esperan Seaborn y muchos asistentes de Matplotlib. La diferencia principal es que stack() opera sobre el índice de columnas y conserva la estructura MultiIndex, mientras que melt() produce un DataFrame largo y plano. Ambos permiten flujos de trabajo de visualización similares.

# Prepare data for line plot using stack
long = df.stack().reset_index()
long.columns = ['student', 'subject', 'score']
print(long)
#   student  subject  score
# 0   Alice     Math     85
# 1   Alice  Science     92
# ...

# Ready for: sns.barplot(data=long, x='student', y='score', hue='subject')

swaplevel() para reordenar índices

Después de aplicar stack, el nivel más interno de las filas corresponde al nombre original de la columna. A veces querrá que el nivel externo sea el nombre de la variable y el nivel interno, el índice de fila original. Use swaplevel() en el MultiIndex para intercambiar el orden de dos niveles y, después, sort_index() para recuperar un orden limpio.

stacked = df.stack()  # MultiIndex: (student, subject)
swapped = stacked.swaplevel()  # MultiIndex: (subject, student)
swapped = swapped.sort_index()
print(swapped)
# subject  student
# Math     Alice      85
#          Bob        90
#          Carol      78
# Science  Alice      92
#          Bob        88
#          Carol      95

Cuándo usar stack, melt o pivot

Elija stack() cuando trabaje con DataFrames de columnas MultiIndex y quiera reducir en uno los niveles de las columnas. Elija melt() cuando tenga un DataFrame plano y quiera pasar del formato ancho al largo, controlando qué columnas se convierten en filas. Elija pivot()/pivot_table() para pasar del formato largo al ancho. Estas tres herramientas cubren todas las necesidades de cambio entre formatos ancho y largo en Pandas.

# Decision guide (comment, not executable standalone):
# MultiIndex columns -> want fewer levels: use stack()
# Flat wide -> need long format for plotting/ML: use melt()
# Long -> need wide summary table: use pivot_table()
# Wide -> back to long: use melt() or stack()

# Example: stack when you have pivot_table output (MultiIndex cols)
tbl = df2.groupby(['region', 'product'])['sales'].sum().unstack()
long_again = tbl.stack().rename('sales').reset_index()
print(long_again)

Resumen práctico: guía rápida para cambiar la forma

Este es un modelo mental conciso: stack() — las columnas se convierten en filas y el DataFrame se vuelve más estrecho y más alto. unstack() — las filas se convierten en columnas y el DataFrame se vuelve más ancho y más bajo. melt() — las columnas con nombre se convierten en un par clave-valor (dos columnas nuevas). pivot_table() — una columna de valores clave se expande en varias columnas. Las cuatro operaciones son reversibles, y saber en qué dirección avanzar solo depende de decidir si el análisis de destino funciona mejor con un formato ancho o largo.

# stack/unstack cycle
df_wide = df.copy()             # wide format
df_long = df_wide.stack()       # long via stack
df_wide2 = df_long.unstack()    # back to wide

# melt/pivot cycle
df_melted = df_wide.melt(id_vars=[])    # wide -> long
# df_pivoted = df_melted.pivot(...)     # long -> wide

print('Original shape:  ', df_wide.shape)
print('After stack:     ', df_long.shape)
print('After unstack:   ', df_wide2.shape)

Comprobación rápida

Compruebe su comprensión de stack y unstack con MultiIndex a partir de lo aprendido en esta lección.

Resumen de la lección

En esta lección ha aprendido lo siguiente: stack() transforma las etiquetas de columna en el índice de filas para producir un resultado más largo y estrecho; unstack() hace lo contrario, convirtiendo un nivel del índice de filas en columnas; ambas operaciones funcionan con estructuras MultiIndex procedentes de operaciones groupby; y swaplevel() permite reordenar los niveles del índice. A continuación, exploraremos pd.crosstab() para crear rápidamente tablas de frecuencias entre columnas categóricas.

Preguntas frecuentes

¿La lección «stack y unstack con MultiIndex» es gratis?

Sí — el texto completo de «stack y unstack con MultiIndex» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

¿Qué aprenderé en «stack y unstack con MultiIndex»?

Gire el nivel de columnas más interno al índice de filas con stack() y revierta la operación con unstack(). Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Pandas & NumPy Academy?

No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «stack y unstack con MultiIndex»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?

Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. pivot_table: tablas de contingencia
  2. melt: de formato ancho a formato largo
  3. stack y unstack con MultiIndex
  4. crosstab para tablas de frecuencias
← Volver a Pandas & NumPy Academy