Selecionando dados de um MultiIndex
Recupere dados nos níveis externo e interno do índice usando .loc com tuplas, fatias e o auxiliar pd.IndexSlice.
Selecionando dados de um MultiIndex é uma aula grátis de Pandas & NumPy Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Pandas & NumPy Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
Navegando por dados hierárquicos
Depois de criar um MultiIndex, você precisa de maneiras eficientes de recuperar subconjuntos de dados. O Pandas fornece três ferramentas para isso: .loc com tuplas para a seleção exata de rótulos, slice() e pd.IndexSlice para a seleção de intervalos entre níveis e .xs() para a seleção de uma seção transversal em um valor de nível específico. Dominar esses padrões de acesso é o que permite aproveitar todo o potencial da indexação hierá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)Selecionando pelo nível externo com .loc
Passe um único rótulo do nível externo para .loc[] para recuperar todas as linhas daquele grupo. Com um MultiIndex de dois níveis (país, ano), df.loc['USA'] retorna todas as linhas dos USA como um DataFrame, mantendo apenas o índice interno (ano). Esse comportamento é chamado de remoção de nível — quando você seleciona um valor específico em um nível externo, o Pandas remove esse nível do índice do objeto retornado.
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)Selecionando uma tupla específica com .loc
Para recuperar uma única linha identificada por ambos os níveis do índice, passe uma tupla para .loc[]: df.loc[('USA', 2022)]. Isso retorna uma Series (ou um escalar para uma única coluna) correspondente exatamente a essa combinação de rótulos (externo, interno). Você deve passar a tupla dentro de uma lista, df.loc[[('USA', 2022)]], se quiser obter um DataFrame em vez de uma 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)]])Selecionando várias linhas com uma lista de tuplas
Para selecionar várias linhas específicas de uma só vez, passe uma lista de tuplas para .loc[]. Isso é útil quando você precisa de um subconjunto não contíguo de linhas identificado por chaves compostas — por exemplo, os dados de 2022 dos USA e do UK, mas não da Alemanha. O resultado preserva o MultiIndex no DataFrame retornado.
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)Fatiando com pd.IndexSlice
pd.IndexSlice (comumente usado com o alias idx) permite escrever fatias de intervalos para níveis de MultiIndex sem construir manualmente fatias de tuplas extensas. Sintaxe: df.loc[idx[outer_slice, inner_slice], column_slice]. Por exemplo, df.loc[idx['UK':'USA', 2022:2023], :] seleciona todas as linhas em que o nível externo está entre UK e USA e o nível interno está entre 2022 e 2023. O índice deve estar ordenado para que isso funcione corretamente.
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)Acesso a seções transversais com .xs()
df.xs(key, level=) seleciona todas as linhas em que um nível específico é igual a determinado valor, independentemente do conteúdo dos outros níveis. Diferentemente de .loc, que exige a especificação dos níveis externos primeiro, .xs pode acessar diretamente qualquer nível pelo nome. Por exemplo, df.xs(2022, level='year') retorna todas as linhas de 2022 para todos os países, sem precisar especificar 'USA', 'UK' ou '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'))Acesso a colunas de um MultiIndex
Quando um DataFrame tem um MultiIndex nas colunas, use tuplas para acessar colunas específicas: df[('revenue', 'Q1')]. Para selecionar todas as colunas de um nível externo (por exemplo, todas as colunas de receita), use df['revenue'], que retorna um DataFrame com todas as colunas do nível interno sob essa chave externa. O padrão pd.IndexSlice também funciona em MultiIndexes de colunas quando combinado com .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')])Selecionando o nível interno em todas as chaves externas
Para selecionar um único valor do nível interno em todos os valores do nível externo, combine .loc com um slice(None) para o nível externo: df.loc[(slice(None), 2022), :]. Isso seleciona a linha de 2022 de todos os países. A versão com pd.IndexSlice é mais legível: df.loc[idx[:, 2022], :]. Esse padrão é frequentemente necessário quando você quer obter um retrato de todas as entidades em um 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)Armadilhas comuns na seleção com MultiIndex
Três armadilhas comuns: 1) Índice não ordenado: fatiar um MultiIndex que não está ordenado gera UnsortedIndexError ou retorna resultados incorretos — sempre chame sort_index() primeiro. 2) KeyError com uma tupla como chave: se você passar uma tupla sem envolvê-la em .loc[], o Python a interpreta como indexação posicional — sempre use .loc para acessar um MultiIndex por rótulos. 3) Incompatibilidade de níveis: depois de usar groupby, os nomes dos níveis do MultiIndex podem não corresponder ao que você espera — verifique df.index.names antes de fatiar.
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', :], :])Exemplo prático: relatório trimestral
Um caso de uso concreto: você tem dados de vendas indexados por (região, trimestre) e precisa extrair o Q4 de todas as regiões para um relatório de fim de ano. Use .xs('Q4', level='quarter') para obter essa seção transversal em uma única chamada. Em seguida, calcule o total com .sum(). Esse padrão — agregação com groupby → resultado com MultiIndex → extração de seção transversal — é extremamente comum em fluxos de trabalho de relatórios empresariais.
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())Combinando a seleção de MultiIndex com colunas
Você pode selecionar linhas e colunas específicas simultaneamente usando .loc[row_indexer, column_list]. Com um MultiIndex, o indexador de linhas é uma tupla, uma lista de tuplas ou um IndexSlice, e o indexador de colunas é um nome de coluna ou uma lista de nomes. Isso permite extrair uma sub-tabela retangular precisa de um DataFrame hierárquico em uma única expressão.
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)Verificação rápida
Teste sua compreensão sobre a seleção com MultiIndex nesta lição.
Recapitulação da lição
Nesta lição, você aprendeu a usar .loc com tuplas para selecionar combinações específicas de rótulos (externo, interno), pd.IndexSlice para fatias de intervalos em quaisquer níveis e .xs() para extrair uma seção transversal em qualquer nível, independentemente das chaves externas. Sempre ordene o índice primeiro para evitar UnsortedIndexError. Em seguida, veremos o alinhamento e a reindexação de índices — como o Pandas alinha dois DataFrames a um índice comum.
Aprenda Python com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 30
- Aulas
- 120
Perguntas Frequentes
A aula “Selecionando dados de um MultiIndex” é grátis?
Sim — o texto completo de “Selecionando dados de um MultiIndex” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Pandas & NumPy Academy, atualize para CoddyKit PRO. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
O que vou aprender em “Selecionando dados de um MultiIndex”?
Recupere dados nos níveis externo e interno do índice usando .loc com tuplas, fatias e o auxiliar pd.IndexSlice. Você pratica Pandas & NumPy Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Pandas & NumPy Academy?
Nenhuma experiência prévia é necessária. Pandas & NumPy Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Selecionando dados de um MultiIndex”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Pandas & NumPy Academy?
Sim. Cada aula de Pandas & NumPy Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Criando um MultiIndex
- Selecionando dados de um MultiIndex
- Alinhamento e reindexação de índices
- Benefícios de desempenho de índices ordenados