Crear un MultiIndex
Construya un índice de filas jerárquico con pd.MultiIndex.from_tuples o con set_index aplicado a varias columnas, e inspeccione sus niveles.
Crear un MultiIndex es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 1 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.
¿Qué es un MultiIndex?
Un MultiIndex (también denominado índice jerárquico) permite que un DataFrame o una Series de Pandas tenga varios niveles de etiquetas de fila. Piense en él como una clave compuesta de una base de datos: en lugar de identificar una fila con una sola etiqueta, la identifica mediante una tupla como (país, ciudad) o (año, trimestre). Los MultiIndex son esenciales para representar datos de panel, series temporales transversales y cualquier conjunto de datos con una estructura natural de agrupación en dos niveles.
import pandas as pd
# A simple example: sales by country and city
data = {
'sales': [100, 200, 150, 300, 80, 120]
}
index = pd.MultiIndex.from_tuples(
[('USA', 'New York'), ('USA', 'Chicago'),
('UK', 'London'), ('UK', 'Manchester'),
('DE', 'Berlin'), ('DE', 'Munich')],
names=['country', 'city']
)
df = pd.DataFrame(data, index=index)
print(df)Creación de un MultiIndex con from_tuples
pd.MultiIndex.from_tuples(list_of_tuples, names=) es la forma más explícita de crear un MultiIndex. Cada tupla se convierte en una etiqueta de fila y sus elementos se convierten en los niveles. El parámetro names asigna una etiqueta a cada nivel (por ejemplo, ['year', 'quarter']). Este método resulta útil cuando dispone de una lista predefinida de claves compuestas que desea utilizar como índice de filas.
import pandas as pd
# Multi-level time index: year x quarter
tuples = [
(2022, 'Q1'), (2022, 'Q2'), (2022, 'Q3'), (2022, 'Q4'),
(2023, 'Q1'), (2023, 'Q2'), (2023, 'Q3'), (2023, 'Q4')
]
mi = pd.MultiIndex.from_tuples(tuples, names=['year', 'quarter'])
revenue = [120, 135, 145, 160, 130, 148, 162, 175]
df = pd.Series(revenue, index=mi, name='revenue_M')
print(df)Creación de un MultiIndex con from_product
pd.MultiIndex.from_product(iterables, names=) crea un MultiIndex a partir del producto cartesiano de varias listas: todas las combinaciones de elementos de las listas de entrada. Es el método más práctico cuando deben existir en los datos todas las combinaciones de niveles. Por ejemplo, todas las combinaciones de 3 años × 4 trimestres × 5 regiones crean automáticamente un panel equilibrado de 60 filas.
import pandas as pd
import numpy as np
years = [2021, 2022, 2023]
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
# Cartesian product: 3 years x 4 quarters = 12 combinations
mi = pd.MultiIndex.from_product([years, quarters], names=['year', 'quarter'])
print('Number of index entries:', len(mi))
print('First 6 entries:', mi[:6].tolist())
# Create a DataFrame with this index
df = pd.DataFrame({'revenue': np.random.randint(100, 200, 12)}, index=mi)
print('\n', df.head())Creación de un MultiIndex con set_index
La forma más habitual de crear un MultiIndex en la práctica consiste en empezar con un DataFrame normal que tenga columnas de agrupación y llamar después a df.set_index([col1, col2]). Esto convierte esas columnas de datos en niveles del índice. El resultado es el mismo que si hubiera creado el índice desde cero con from_tuples, pero solo requiere una línea partiendo de datos tabulares.
import pandas as pd
# Start with a flat DataFrame
df_flat = pd.DataFrame({
'country': ['USA', 'USA', 'UK', 'UK', 'DE', 'DE'],
'year': [2022, 2023, 2022, 2023, 2022, 2023],
'gdp_bn': [25000, 26000, 3100, 3200, 4200, 4350]
})
# Promote two columns to a MultiIndex
df = df_flat.set_index(['country', 'year'])
print(df)
print('\nIndex type:', type(df.index).__name__)
print('Index names:', df.index.names)Inspección de los niveles de un MultiIndex
Un MultiIndex almacena sus datos en levels (los valores únicos de cada nivel) y codes (punteros enteros a las matrices de niveles). Inspeccione los niveles con df.index.levels o df.index.get_level_values(level). Utilice df.index.nlevels para comprobar cuántos niveles existen. El atributo names muestra el nombre asignado a cada nivel; asígnelos con df.index.set_names(['level0', 'level1']).
import pandas as pd
df_flat = pd.DataFrame({
'country': ['USA', 'USA', 'UK', 'UK'],
'year': [2022, 2023, 2022, 2023],
'gdp': [25000, 26000, 3100, 3200]
})
df = df_flat.set_index(['country', 'year'])
print('Number of levels:', df.index.nlevels)
print('Level names:', df.index.names)
print('Level 0 values:', df.index.get_level_values(0).tolist())
print('Level 1 values:', df.index.get_level_values(1).tolist())
print('Unique level 0:', df.index.get_level_values('country').unique().tolist())MultiIndex en las columnas
También puede aplicar un MultiIndex a las columnas, creando una jerarquía de etiquetas de columna. Esto es habitual cuando se almacenan varias métricas para cada categoría en un diseño similar al de una tabla dinámica, por ejemplo, (ingresos, T1), (ingresos, T2), (costes, T1), (costes, T2). Acceda a las columnas con un MultiIndex del mismo modo que accede a las filas: mediante tuplas. Cree un MultiIndex de columnas con pd.MultiIndex.from_product y asígnelo a df.columns.
import pandas as pd
import numpy as np
# Create a DataFrame with MultiIndex columns
metrics = ['revenue', 'cost']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
col_index = pd.MultiIndex.from_product([metrics, quarters], names=['metric', 'quarter'])
data = np.random.randint(50, 200, size=(3, 8))
df = pd.DataFrame(data, columns=col_index, index=['USA', 'UK', 'DE'])
df.index.name = 'country'
print(df)MultiIndex después de una agregación con GroupBy
Cuando llama a groupby([col1, col2]).agg(...), el DataFrame resultante tiene un MultiIndex en sus filas (las dos claves de groupby se convierten en los dos niveles del índice) y, potencialmente, otro MultiIndex en sus columnas (si agrega varias métricas). Esta es la forma más habitual de encontrarse con un MultiIndex en el análisis de datos cotidiano; entender cómo recorrerlo es esencial para trabajar con resultados de groupby.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
# Two-key groupby creates a MultiIndex on rows
result = tips.groupby(['day', 'time'])['total_bill'].agg(['mean', 'count'])
print(result)
print('\nIndex type:', type(result.index).__name__)
print('Index names:', result.index.names)Intercambio y reordenación de niveles
Utilice df.swaplevel() para intercambiar dos niveles del índice y df.reorder_levels([...]) para cambiar el orden de todos los niveles. Reordenar resulta útil cuando desea segmentar primero por un nivel interno o cuando dos DataFrames tienen sus niveles de índice en un orden diferente y deben alinearse antes de fusionarlos. Después de reordenar, llame siempre a sort_index() para restaurar el orden lexicográfico y permitir una segmentación eficiente.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
result = tips.groupby(['day', 'time'])['total_bill'].mean()
print('Original levels:', result.index.names)
# Swap so time is the outer level
swapped = result.swaplevel().sort_index()
print('\nSwapped levels:', swapped.index.names)
print(swapped.head())Comprobación y ordenación de un MultiIndex
La segmentación de un MultiIndex solo es eficiente cuando el índice está ordenado lexicográficamente. Compruebe si el índice está ordenado con df.index.is_monotonic_increasing. Si devuelve False, ordénelo con df.sort_index(). Un MultiIndex sin ordenar genera un PerformanceWarning en las operaciones de segmentación y puede devolver resultados incorrectos en algunos casos extremos; ordénelo siempre después de crear o modificar un MultiIndex.
import pandas as pd
# Create an unsorted MultiIndex deliberately
tuples = [('B', 2), ('A', 1), ('B', 1), ('A', 2)]
mi = pd.MultiIndex.from_tuples(tuples, names=['letter', 'num'])
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=mi)
print('Is sorted:', df.index.is_monotonic_increasing)
print('Before sorting:')
print(df)
df_sorted = df.sort_index()
print('\nAfter sorting:')
print(df_sorted)
print('Is sorted:', df_sorted.index.is_monotonic_increasing)Restablecimiento de un MultiIndex a columnas
Llame a df.reset_index() para volver a convertir todos los niveles del índice en columnas normales y dejar el DataFrame con un RangeIndex de enteros simple. Este es un patrón habitual después de realizar agregaciones con groupby: calcule el resumen agrupado con un MultiIndex y, después, restablezca el índice para obtener un DataFrame plano adecuado para realizar más operaciones con Pandas, combinar datos o exportarlos a CSV. Use reset_index(level='name') para restablecer solo un nivel de un índice de dos niveles.
import pandas as pd
import seaborn as sns
tips = sns.load_dataset('tips')
result = tips.groupby(['day', 'time'])['total_bill'].mean()
print('MultiIndex result:')
print(result.head(4))
# Flatten back to a regular DataFrame
flat = result.reset_index()
print('\nFlattened DataFrame:')
print(flat.head(4))
print('Index type:', type(flat.index).__name__)Cuándo usar un MultiIndex
Use un MultiIndex cuando sus datos tengan una estructura jerárquica natural: series temporales con granularidad inferior al día (fecha + hora), datos de panel (entidad + periodo) o agrupaciones anidadas (país + región + ciudad). Evite los MultiIndex para claves de agrupación sencillas de dos columnas cuando un DataFrame plano con columnas separadas sea igual de legible. Si se encuentra llamando constantemente a reset_index() solo para acceder a los datos, es una señal de que el MultiIndex no está aportando valor en su flujo de trabajo.
Comprobación rápida
Compruebe su comprensión de la creación de MultiIndex a partir de esta lección.
Resumen de la lección
En esta lección ha aprendido que los MultiIndex proporcionan etiquetas jerárquicas de filas (o columnas) mediante tuplas, y que se crean con from_tuples, from_product o set_index sobre varias columnas, y siempre se ordenan para realizar segmentaciones de forma eficiente. A continuación, exploraremos cómo seleccionar datos de un MultiIndex mediante .loc, tuplas, segmentos y el asistente IndexSlice.
Preguntas frecuentes
¿La lección «Crear un MultiIndex» es gratis?
Sí — el texto completo de «Crear un 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 «Crear un MultiIndex»?
Construya un índice de filas jerárquico con pd.MultiIndex.from_tuples o con set_index aplicado a varias columnas, e inspeccione sus niveles. 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 1 de 4.
¿Cuánto tiempo toma la lección «Crear un 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
- Crear un MultiIndex
- Seleccionar datos de un MultiIndex
- Alineación y reindexación de índices
- Ventajas de rendimiento de los índices ordenados