Pandas MultiIndex (índice multinivel)
El MultiIndex (índice multinivel) es una potente funcionalidad de índice en Pandas que permite crear estructuras jerárquicas de varios niveles en las filas o columnas. Esto resulta especialmente útil al trabajar con datos de alta dimensionalidad, estadísticas por grupos y datos de panel.
Crear MultiIndex
Crear desde una lista
Ejemplo
# Método 1: crear usando arreglos
arrays = [
["A", "A", "B", "B", "C", "C"],
[1, 2, 1, 2, 1, 2]
]
# Usar pd.MultiIndex.from_arrays
index = pd.MultiIndex.from_arrays(arrays, names=["Categoría", "Número"])
print("Creado desde arreglos:")
print(index)
print()
# Método 2: usar una lista de tuplas
tuples = [
("A", 1), ("A", 2), ("B", 1), ("B", 2), ("C", 1), ("C", 2)
]
index = pd.MultiIndex.from_tuples(tuples, names=["Categoría", "Número"])
print("Creado desde tuplas:")
print(index)
print()
# Método 3: usar product
index = pd.MultiIndex.from_product(
[["A", "B", "C"], [1, 2, 3]],
names=["Categoría", "Número"]
)
print("Creado desde product:")
print(index)
Crear un DataFrame con MultiIndex
Ejemplo
import numpy as np
# Crear un DataFrame con índice multinivel
df = pd.DataFrame(
np.random.randn(6, 4),
index=pd.MultiIndex.from_tuples(
[("2024", "Q1"), ("2024", "Q2"), ("2024", "Q3"),
("2025", "Q1"), ("2025", "Q2"), ("2025", "Q3")]
),
columns=["Beijing", "Shanghái", "Guangzhou", "Shenzhen"]
)
df.index.names = ["Año", "Trimestre"]
print("DataFrame con índice multinivel:")
print(df)
Acceso al índice multinivel
Acceso con loc/iloc
Ejemplo
# Crear datos de ejemplo
df = pd.DataFrame({
"Lengua china": [85, 92, 78, 88],
"Matemáticas": [90, 88, 95, 82]
}, index=pd.MultiIndex.from_tuples(
[("Primero de bachillerato", "Clase A"), ("Primero de bachillerato", "Clase B"), ("Segundo de bachillerato", "Clase A"), ("Segundo de bachillerato", "Clase B")],
names=["Grado", "Clase"]
))
print("Datos originales:")
print(df)
print()
# Acceso mediante el índice externo
print("Acceder a todos los de primero de bachillerato:")
print(df.loc["Primero de bachillerato"])
print()
# Acceso mediante el índice interno
print("Acceder a la clase A:")
print(df.loc[:, "Clase A"])
print()
# Acceso mediante índice multinivel
print("Acceder a la clase A de primero de bachillerato:")
print(df.loc[("Primero de bachillerato", "Clase A")])
Acceso con xs
Ejemplo
# Crear datos de ejemplo
df = pd.DataFrame({
"Lengua china": [85, 92, 78, 88],
"Matemáticas": [90, 88, 95, 82]
}, index=pd.MultiIndex.from_tuples(
[("Primero de bachillerato", "Clase A"), ("Primero de bachillerato", "Clase B"), ("Segundo de bachillerato", "Clase A"), ("Segundo de bachillerato", "Clase B")],
names=["Grado", "Clase"]
))
# Usar xs para acceder a los valores de un nivel específico
print("Acceder a primero de bachillerato con xs:")
print(df.xs("Primero de bachillerato", level="Grado"))
print()
print("Acceder a la clase A con xs:")
print(df.xs("Clase A", level="Clase"))
Conversión del índice multinivel
Apilado y desapilado
Ejemplo
import numpy as np
# Crear un DataFrame en formato ancho
df = pd.DataFrame(
np.arange(12).reshape(3, 4),
index=pd.MultiIndex.from_tuples(
[("Beijing", "2024"), ("Shanghái", "2024"), ("Guangzhou", "2024")]
),
columns=pd.MultiIndex.from_tuples(
[("Q1", "Ingresos"), ("Q1", "Ganancias"), ("Q2", "Ingresos"), ("Q2", "Ganancias")]
)
)
print("Datos originales (columnas anidadas):")
print(df)
print()
# unstack: convierte el índice interno en columnas
df_unstacked = df.unstack()
print("Después de unstack:")
print(df_unstacked)
print()
# stack: convierte las columnas en índice interno
df_stacked = df_unstacked.stack()
print("Después de stack:")
print(df_stacked)
Ordenación del índice multinivel
Ejemplo
# Crear un DataFrame con índice desordenado
df = pd.DataFrame({
"Valor": [1, 2, 3, 4, 5, 6]
}, index=pd.MultiIndex.from_tuples(
[("C", 2), ("A", 1), ("B", 2), ("A", 2), ("C", 1), ("B", 1)],
names=["Letra", "Número"]
))
print("Datos desordenados:")
print(df)
print()
# Ordenar por el nivel externo
df_sorted1 = df.sort_index()
print("Después de ordenar por el nivel externo:")
print(df_sorted1)
print()
# Ordenar por el nivel interno
df_sorted2 = df.sort_index(level=1)
print("Después de ordenar por el nivel interno:")
print(df_sorted2)
print()
# Ordenación multinivel
df_sorted3 = df.sort_index(level=[0, 1])
print("Después de ordenar por varios niveles:")
print(df_sorted3)
Práctica: estadísticas por grupos
El índice multinivel es muy adecuado para realizar estadísticas por grupos y análisis de tablas dinámicas.
Ejemplo
import numpy as np
# Crear datos de ventas
np.random.seed(42)
df = pd.DataFrame({
"Año": ["2023"] * 6 + ["2024"] * 6,
"Trimestre": ["Q1", "Q2", "Q3", "Q4"] * 3,
"Producto": ["Móvil", "Móvil", "Computadora", "Computadora"] * 3,
"Región": ["Este de China", "Sur de China", "Norte de China"] * 4,
"Ventas": np.random.randint(100, 500, 12)
})
print("Datos de ventas originales:")
print(df)
print()
# Configurar el índice multinivel y luego realizar estadísticas por grupos
df_grouped = df.set_index(["Año", "Trimestre", "Producto", "Región"])
print("Agrupado por año, trimestre, producto y región:")
print(df_grouped)
# Resumir por año
yearly = df_grouped.groupby(level="Año").sum()
print("\nVentas anuales:")
print(yearly)
# Resumir por año y trimestre
quarterly = df_grouped.groupby(level=["Año", "Trimestre"]).sum()
print("\nVentas trimestrales:")
print(quarterly)
Preguntas frecuentes y precauciones
1. Niveles de índice desordenados
Ten cuidado al manipular los datos para evitar que los niveles se desordenen. Se recomienda verificar antes y después de las operaciones.df.index.names。
2. Error al acceder al índice
locUsa etiquetas para acceder,ilocusa posiciones para acceder; no combines ambos métodos.
3. Índices duplicados al usar concat
Al usarconcatconcat para combinar datos, si hay índices duplicados puede dar resultados inesperados; puedes usarignore_index=Truereset para restablecer.
Otras extensionesEl índice multinivel es una funcionalidad central de Pandas para manejar datos de alta dimensionalidad. Un uso adecuado del índice multinivel permite organizar los datos de forma más clara y hacer que las estadísticas sean más convenientes.