Definindo e redefinindo o índice
Promova uma coluna a índice das linhas com set_index(), redefina-a com reset_index() e use uma visão geral de um MultiIndex.
Definindo e redefinindo o índice é uma aula grátis de Pandas & NumPy Academy no CoddyKit. Esta é a aula 4 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.
O que é o índice do DataFrame?
Todo DataFrame do Pandas tem um índice de linhas — um conjunto de rótulos associados a cada linha. O índice padrão é um RangeIndex (0, 1, 2, …), mas você pode substituí-lo por qualquer coluna que funcione como um identificador natural: uma data, um ID de produto, um ID de usuário ou qualquer chave exclusiva. Um índice significativo melhora a legibilidade, permite a seleção baseada em rótulos e é necessário para a reamostragem de séries temporais.
import pandas as pd
df = pd.DataFrame({
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
'sales': [100, 200, 150]
})
print('Default index:', df.index.tolist()) # [0, 1, 2]
print(df)set_index() — promovendo uma coluna
DataFrame.set_index('col') promove a coluna especificada para se tornar o índice de linhas, removendo-a das colunas regulares. Os valores da coluna tornam-se rótulos de linha. Essa é a forma padrão de tornar um DataFrame mais expressivo quando uma coluna funciona como uma chave natural. Um novo DataFrame é retornado; o original permanece inalterado, a menos que inplace=True seja usado.
import pandas as pd
df = pd.DataFrame({
'date': ['2024-01-01', '2024-01-02', '2024-01-03'],
'sales': [100, 200, 150]
})
df = df.set_index('date')
print(df)
# sales
# date
# 2024-01-01 100
# 2024-01-02 200
# 2024-01-03 150
print(df.index) # Index(['2024-01-01', ...], dtype='object', name='date')Selecionando linhas com um índice personalizado
Depois que uma coluna significativa se torna o índice, você pode usar .loc[label] para recuperar linhas pelo rótulo com uma sintaxe limpa e legível — sem precisar de máscaras booleanas. Para um DatetimeIndex, você pode até usar textos de data parciais, como df.loc['2024-01'], para selecionar todas as linhas de janeiro de 2024.
import pandas as pd
df = pd.DataFrame({
'product': ['A', 'B', 'C'],
'price': [10, 20, 30],
'stock': [100, 50, 75]
})
df = df.set_index('product')
# Access row by label
print(df.loc['B'])
# price 20
# stock 50
# Name: B, dtype: int64set_index() com várias colunas — MultiIndex
Passar uma lista de nomes de colunas para set_index() cria um MultiIndex (índice hierárquico). O DataFrame resultante pode ser acessado usando tuplas em .loc[]. O MultiIndex é essencial para séries temporais agrupadas (região + data), dados em painel (entidade + tempo) e qualquer análise que exija agrupamento de linhas em dois níveis.
import pandas as pd
df = pd.DataFrame({
'region': ['East', 'East', 'West', 'West'],
'year': [2023, 2024, 2023, 2024],
'revenue': [100, 150, 200, 220]
})
df = df.set_index(['region', 'year'])
print(df)
# revenue
# region year
# East 2023 100
# 2024 150
# West 2023 200
# 2024 220
print(df.loc[('East', 2024)]) # revenue = 150Parâmetro drop= em set_index()
Por padrão, set_index('col') remove a coluna das colunas regulares do DataFrame assim que ela se torna o índice. Passe drop=False para manter a coluna no lugar e também usá-la como índice. Isso é útil quando você deseja acesso baseado em rótulos, mas também precisa da coluna disponível para cálculos no espaço das colunas regulares.
import pandas as pd
df = pd.DataFrame({'id': [1, 2, 3], 'value': [10, 20, 30]})
# Keep 'id' as both index and column
df_with_both = df.set_index('id', drop=False)
print(df_with_both)
# id value
# id
# 1 1 10
# 2 2 20
# 3 3 30reset_index() — movendo o índice de volta para uma coluna
reset_index() é o inverso de set_index(): move o índice de linhas atual de volta para uma coluna regular e substitui o índice pelo RangeIndex padrão. Isso é normalmente necessário após um groupby().agg() ou depois de operações que deixam você com um índice significativo que precisa ser usado como coluna em um processamento posterior.
import pandas as pd
df = pd.DataFrame({'sales': [100, 200]}, index=['East', 'West'])
df.index.name = 'region'
reset = df.reset_index()
print(reset)
# region sales
# 0 East 100
# 1 West 200
print(reset.index.tolist()) # [0, 1] — default RangeIndex restoredreset_index(drop=True)
Passar drop=True para reset_index() descarta completamente o índice atual, em vez de movê-lo para uma coluna. Use isso quando o índice atual não contiver informações significativas (por exemplo, após filtrar linhas, quando o índice tem lacunas como 0, 3, 7) e você quiser apenas um índice sequencial limpo começando em 0.
import pandas as pd
df = pd.DataFrame({'x': [10, 20, 30, 40, 50]})
filtered = df[df['x'] > 15]
print('Filtered index:', filtered.index.tolist()) # [1, 2, 3, 4]
# Drop the old index — don't move it to a column
clean = filtered.reset_index(drop=True)
print('Clean index:', clean.index.tolist()) # [0, 1, 2, 3]reset_index() após groupby
Depois de chamar groupby().agg(), as chaves de agrupamento tornam-se o índice. Chamar reset_index() as converte novamente em colunas regulares, produzindo um resultado tabular simples, mais fácil de manipular, combinar ou exportar. Esse é um dos usos mais comuns de reset_index() na prática.
import pandas as pd
df = pd.DataFrame({
'dept': ['Eng', 'HR', 'Eng', 'Sales', 'HR'],
'salary': [90000, 50000, 80000, 70000, 55000]
})
# After groupby, dept becomes the index
agg = df.groupby('dept')['salary'].mean()
print(type(agg), agg.index.tolist())
# dept is the index
# Reset makes dept a regular column again
result = agg.reset_index()
result.columns = ['dept', 'avg_salary']
print(result)rename_axis() para nomear o índice
Quando o índice de linhas não tem nome, ou quando você quer renomeá-lo para maior clareza, use df.rename_axis('new_name') (para o índice de linhas) ou df.rename_axis('col_name', axis=1) (para o eixo das colunas). Dar um nome significativo ao índice torna o resultado mais autoexplicativo, especialmente ao exportar para CSV, quando o nome do índice se torna um cabeçalho de coluna.
import pandas as pd
df = pd.DataFrame({'sales': [100, 200, 300]}, index=['A', 'B', 'C'])
print(df.index.name) # None
# Name the index
df = df.rename_axis('region')
print(df)
# sales
# region
# A 100
# B 200
# C 300Reindexação para preencher lacunas
DataFrame.reindex(new_index) remodela o DataFrame para corresponder a um novo índice, preenchendo com NaN as posições que existem no novo índice, mas não nos dados originais. Isso é usado para alinhar DataFrames a um índice completo comum — por exemplo, garantindo que todos os meses de um ano apareçam, mesmo que não existam dados para alguns deles.
import pandas as pd
df = pd.DataFrame({
'month': ['Jan', 'Mar', 'Jun'],
'revenue': [100, 200, 300]
}).set_index('month')
all_months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
complete = df.reindex(all_months)
print(complete)
# revenue
# Jan 100.0
# Feb NaN <- filled with NaN
# Mar 200.0
# Apr NaN
# May NaN
# Jun 300.0reset_index e seleção de níveis em MultiIndex
Para um DataFrame com MultiIndex, reset_index() move todos os níveis de volta para as colunas por padrão. Passe level= para redefinir apenas níveis específicos. Isso é útil quando você quer manter um nível como índice (por exemplo, manter a data como índice) e mover apenas o outro nível para uma coluna.
import pandas as pd
df = pd.DataFrame(
{'revenue': [100, 150, 200, 220]},
index=pd.MultiIndex.from_tuples(
[('East', 2023), ('East', 2024), ('West', 2023), ('West', 2024)],
names=['region', 'year']
)
)
# Reset only the 'year' level, keep 'region' as index
df2 = df.reset_index(level='year')
print(df2)
# year revenue
# region
# East 2023 100
# East 2024 150
# West 2023 200
# West 2024 220Verificação rápida
Teste sua compreensão sobre como definir e redefinir o índice.
Recapitulação da lição
Nesta lição, você aprendeu que set_index('col') promove uma coluna ao índice de linhas para permitir acesso baseado em rótulos, passar uma lista cria um MultiIndex e reset_index() move o índice de volta para uma coluna (use drop=True para descartá-lo). Use reindex() para alinhar os dados a um índice de destino completo, preenchendo as posições ausentes com NaN. Essas técnicas são fundamentais para as próximas lições sobre GroupBy e combinação de dados.
Perguntas Frequentes
A aula “Definindo e redefinindo o índice” é grátis?
Sim — o texto completo de “Definindo e redefinindo o índice” é 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 “Definindo e redefinindo o índice”?
Promova uma coluna a índice das linhas com set_index(), redefina-a com reset_index() e use uma visão geral de um MultiIndex. 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 4 de 4.
Quanto tempo leva a aula “Definindo e redefinindo o índice”?
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
- Ordenando por valores das colunas
- Ordenando pelo índice
- Classificando valores
- Definindo e redefinindo o índice