Pandas & NumPy Academy · Aula

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.

Aula 2 de 413 etapas

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.

Grátis para começar

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

  1. Criando um MultiIndex
  2. Selecionando dados de um MultiIndex
  3. Alinhamento e reindexação de índices
  4. Benefícios de desempenho de índices ordenados
← Voltar para Pandas & NumPy Academy