Pandas & NumPy Academy · Lección

Seleccionar datos de un MultiIndex

Recupere datos de los niveles externo e interno del índice mediante .loc con tuplas, segmentos y el asistente pd.IndexSlice.

Lección 2 de 413 pasos

Seleccionar datos de un MultiIndex es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 2 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.

Navegación por datos jerárquicos

Una vez que tiene un MultiIndex, necesita formas eficientes de recuperar subconjuntos de datos. Pandas proporciona tres herramientas para ello: .loc con tuplas para seleccionar etiquetas exactas, slice() y pd.IndexSlice para seleccionar rangos entre niveles, y .xs() para seleccionar una sección transversal en un valor de nivel específico. Dominar estos patrones de acceso es lo que permite aprovechar todo el potencial de la indexación jerárquica.

import pandas as pd
import numpy as np

# Setup: GDP data by country and year
df_flat = pd.DataFrame({
    'country': ['USA','USA','USA','UK','UK','UK','DE','DE','DE'],
    'year': [2021, 2022, 2023, 2021, 2022, 2023, 2021, 2022, 2023],
    'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200, 4100, 4200, 4350]
})
df = df_flat.set_index(['country', 'year']).sort_index()
print(df)

Selección por el nivel externo con .loc

Pase una única etiqueta del nivel externo a .loc[] para recuperar todas las filas de ese grupo. Con un MultiIndex de dos niveles (country, year), df.loc['USA'] devuelve todas las filas de USA como un DataFrame en el que solo permanece el índice interno (year). Este comportamiento se denomina eliminación de nivel: cuando selecciona un valor específico de un nivel externo, Pandas elimina ese nivel del índice del objeto devuelto.

import pandas as pd

df_flat = pd.DataFrame({
    'country': ['USA','USA','USA','UK','UK','UK'],
    'year': [2021, 2022, 2023, 2021, 2022, 2023],
    'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200]
})
df = df_flat.set_index(['country', 'year']).sort_index()

# Select all USA rows
usa = df.loc['USA']
print('All USA rows:')
print(usa)
print('\nRemaining index type:', usa.index.name)

Selección de una tupla específica con .loc

Para recuperar una única fila identificada por ambos niveles del índice, pase una tupla a .loc[]: df.loc[('USA', 2022)]. Esto devuelve una Series (o un escalar si se trata de una sola columna) correspondiente exactamente a esa combinación de etiquetas (externa, interna). Debe pasar la tupla dentro de una lista, df.loc[[('USA', 2022)]], si desea obtener un DataFrame en lugar de una Series.

import pandas as pd

df_flat = pd.DataFrame({
    'country': ['USA','USA','USA','UK','UK','UK'],
    'year': [2021, 2022, 2023, 2021, 2022, 2023],
    'gdp_bn': [23000, 25000, 26000, 3000, 3100, 3200],
    'cpi': [3.2, 5.1, 4.8, 2.5, 3.4, 3.0]
})
df = df_flat.set_index(['country', 'year']).sort_index()

# Single row as Series
print('USA 2022 (Series):')
print(df.loc[('USA', 2022)])

# Single row as DataFrame
print('\nUSA 2022 (DataFrame):')
print(df.loc[[('USA', 2022)]])

Selección de varias filas con una lista de tuplas

Para seleccionar varias filas específicas a la vez, pase una lista de tuplas a .loc[]. Esto resulta útil cuando necesita un subconjunto no contiguo de filas identificado por claves compuestas; por ejemplo, los datos de 2022 de USA y UK, pero no de Alemania. El resultado conserva el MultiIndex en el DataFrame devuelto.

import pandas as pd

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]
})
df = df_flat.set_index(['country', 'year']).sort_index()

# Select specific (country, year) combinations
subset = df.loc[[('USA', 2022), ('UK', 2023), ('DE', 2022)]]
print(subset)

Segmentación con pd.IndexSlice

pd.IndexSlice (que normalmente se abrevia como idx) permite escribir segmentos de rango para los niveles de un MultiIndex sin tener que construir manualmente segmentos de tuplas extensos. Sintaxis: df.loc[idx[outer_slice, inner_slice], column_slice]. Por ejemplo, df.loc[idx['UK':'USA', 2022:2023], :] selecciona todas las filas cuyo nivel externo está entre UK y USA y cuyo nivel interno está entre 2022 y 2023. El índice debe estar ordenado para que esto funcione correctamente.

import pandas as pd
import numpy as np

years = [2021, 2022, 2023]
countries = ['DE', 'UK', 'USA']
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': np.random.randint(3000, 26000, 9)}, index=mi)

idx = pd.IndexSlice

# Select UK and USA for years 2022 and 2023
subset = df.loc[idx['UK':'USA', 2022:2023], :]
print(subset)

Acceso a una sección transversal con .xs()

df.xs(key, level=) selecciona todas las filas en las que un nivel específico es igual a un valor determinado, independientemente del contenido de los demás niveles. A diferencia de .loc, que requiere especificar primero los niveles externos, .xs puede acceder directamente a cualquier nivel por su nombre. Por ejemplo, df.xs(2022, level='year') devuelve todas las filas de 2022 de todos los países sin necesidad de especificar 'USA', 'UK' o 'DE'.

import pandas as pd
import numpy as np

countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000]}, index=mi)

# All countries for year 2022 (inner level)
print('All data for year 2022:')
print(df.xs(2022, level='year'))

# All years for UK (outer level)
print('\nAll years for UK:')
print(df.xs('UK', level='country'))

Acceso a columnas de un MultiIndex

Cuando un DataFrame tiene un MultiIndex en las columnas, use tuplas para acceder a columnas específicas: df[('revenue', 'Q1')]. Para seleccionar todas las columnas de un nivel externo (por ejemplo, todas las columnas de revenue), use df['revenue'], que devuelve un DataFrame con todas las columnas del nivel interno bajo esa clave externa. El patrón pd.IndexSlice también funciona con MultiIndex de columnas cuando se combina con .loc.

import pandas as pd
import numpy as np

metrics = ['revenue', 'cost']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
cols = pd.MultiIndex.from_product([metrics, quarters], names=['metric', 'quarter'])
df = pd.DataFrame(
    np.random.randint(50, 200, (3, 8)),
    columns=cols,
    index=['USA', 'UK', 'DE']
)

# Access all revenue columns
print('Revenue columns:')
print(df['revenue'])

# Access a specific cell
print('\nUSA revenue Q1:', df.loc['USA', ('revenue', 'Q1')])

Selección del nivel interno en todas las claves externas

Para seleccionar un único valor del nivel interno en todos los valores del nivel externo, combine .loc con un slice(None) para el nivel externo: df.loc[(slice(None), 2022), :]. Esto selecciona la fila de 2022 de todos los países. La versión con pd.IndexSlice es más legible: df.loc[idx[:, 2022], :]. Este patrón suele ser necesario cuando desea obtener una instantánea de todas las entidades en un momento específico.

import pandas as pd
import numpy as np

countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000]}, index=mi)

idx = pd.IndexSlice

# All countries for year 2022 (using IndexSlice)
all_2022 = df.loc[idx[:, 2022], :]
print('All countries in 2022:')
print(all_2022)

Errores habituales al seleccionar con MultiIndex

Tres errores habituales: 1) Índice sin ordenar: segmentar un MultiIndex que no está ordenado genera UnsortedIndexError o devuelve resultados incorrectos; llame siempre primero a sort_index(). 2) KeyError al usar una tupla como clave: si pasa una tupla sin incluirla en .loc[], Python la interpreta como indexación posicional; use siempre .loc para acceder a un MultiIndex mediante etiquetas. 3) Incompatibilidad de niveles: después de usar groupby, los nombres de los niveles del MultiIndex pueden no coincidir con lo que espera; compruebe df.index.names antes de segmentar.

import pandas as pd

# Unsorted MultiIndex slicing
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)
# Sort before slicing
df = df.sort_index()
print('After sort:', df.index.is_monotonic_increasing)

idx = pd.IndexSlice
print('\nSlice A:')
print(df.loc[idx['A', :], :])

Ejemplo práctico: informes trimestrales

Un caso de uso concreto: tiene datos de ventas indexados por (region, quarter) y necesita extraer el cuarto trimestre de todas las regiones para un informe de cierre anual. Use .xs('Q4', level='quarter') para obtener esta sección transversal en una sola llamada. Después, calcule el total con .sum(). Este patrón —agregación con groupby → resultado con MultiIndex → extracción de una sección transversal— es extremadamente habitual en los flujos de generación de informes empresariales.

import pandas as pd
import numpy as np

regions = ['North', 'South', 'East', 'West']
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
mi = pd.MultiIndex.from_product([regions, quarters], names=['region', 'quarter'])

np.random.seed(42)
df = pd.DataFrame({
    'sales': np.random.randint(200, 500, 16),
    'units': np.random.randint(50, 150, 16)
}, index=mi)

# Extract Q4 performance across all regions
q4 = df.xs('Q4', level='quarter')
print('Q4 Results by Region:')
print(q4)
print('\nQ4 Total Sales:', q4['sales'].sum())

Combinación de la selección de MultiIndex con columnas

Puede seleccionar filas y columnas específicas simultáneamente mediante .loc[row_indexer, column_list]. Con un MultiIndex, el indexador de filas es una tupla, una lista de tuplas o IndexSlice, y el indexador de columnas es un nombre de columna o una lista de nombres. Esto le permite extraer una subtabla rectangular precisa de un DataFrame jerárquico mediante una sola expresión.

import pandas as pd
import numpy as np

countries = ['DE', 'UK', 'USA']
years = [2021, 2022, 2023]
mi = pd.MultiIndex.from_product([countries, years], names=['country', 'year'])
df = pd.DataFrame({
    'gdp': [4100,4200,4350, 3000,3100,3200, 23000,25000,26000],
    'inflation': [1.5, 2.1, 2.8, 2.0, 3.4, 2.9, 3.2, 5.1, 4.8],
    'unemployment': [5.0, 4.8, 4.5, 4.5, 4.2, 4.0, 3.8, 3.5, 3.3]
}, index=mi)

idx = pd.IndexSlice

# UK and USA, years 2022-2023, only gdp and inflation
result = df.loc[idx['UK':'USA', 2022:2023], ['gdp', 'inflation']]
print(result)

Comprobación rápida

Compruebe su comprensión de la selección con MultiIndex a partir de esta lección.

Resumen de la lección

En esta lección ha aprendido a usar .loc con tuplas para seleccionar combinaciones específicas de etiquetas (externa, interna), pd.IndexSlice para segmentar rangos en cualquier nivel y .xs() para extraer una sección transversal en cualquier nivel, independientemente de las claves externas. Ordene siempre primero el índice para evitar UnsortedIndexError. A continuación, exploraremos la alineación y el reindexado de índices: cómo alinea Pandas dos DataFrame con un índice común.

Gratis para empezar

Aprende Python con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
30
Lecciones
120

Preguntas frecuentes

¿La lección «Seleccionar datos de un MultiIndex» es gratis?

Sí — el texto completo de «Seleccionar datos de 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 «Seleccionar datos de un MultiIndex»?

Recupere datos de los niveles externo e interno del índice mediante .loc con tuplas, segmentos y el asistente pd.IndexSlice. 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 2 de 4.

¿Cuánto tiempo toma la lección «Seleccionar datos de 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

  1. Crear un MultiIndex
  2. Seleccionar datos de un MultiIndex
  3. Alineación y reindexación de índices
  4. Ventajas de rendimiento de los índices ordenados
← Volver a Pandas & NumPy Academy