HOWTO · Pandas

Definir Colunas como Índice em Pandas Dataframe

Este tutorial demonstra como definir colunas como índice num DataFrame do pandas com o método `set_index()` e com o parâmetro `index_col` ao ler um ficheiro.

Nesta página

Um novo DataFrame do Pandas usa um índice inteiro predefinido para identificar as linhas. Para usar rótulos de linha mais significativos, chame set_index() num DataFrame existente ou passe index_col a read_csv ou read_excel ao carregar o ficheiro. A primeira abordagem é útil quando os dados já estão na memória; a segunda escolhe os rótulos durante a importação. Os exemplos abaixo usam o mesmo pequeno conjunto de dados sobre pessoas para poder comparar os resultados. Escolha uma coluna cujos valores facilitem a identificação das linhas na sua análise. Um índice pode conter valores repetidos, embora uma pesquisa por um rótulo repetido possa devolver mais de uma linha.

Definir uma coluna do DataFrame como índice com set_index()

set_index() é um método de DataFrame. Por predefinição, devolve um novo DataFrame e remove a coluna selecionada das colunas regulares. Atribua o resultado se quiser manter o DataFrame original inalterado. Passe uma lista de nomes de colunas para criar um MultiIndex, que identifica cada linha através de uma combinação de valores. Use drop=False se quiser manter os valores selecionados também como colunas de dados regulares.

Estas opções afetam a forma como acede aos dados, não se as linhas são descartadas. Por exemplo, mantenha uma coluna de nomes quando o código seguinte precisar dela tanto como rótulo como valor, ou use um MultiIndex de cidade e idade quando essa combinação for relevante para o seu trabalho. Se quiser alterar o próprio DataFrame existente, set_index(..., inplace=True) faz essa alteração e devolve None; em geral, atribuir o DataFrame devolvido por predefinição é mais fácil de acompanhar e permite preservar o original. Para voltar a um índice regular, reset_index() coloca os valores atuais do índice em colunas e, por predefinição, atribui ao resultado um novo índice inteiro. Isto é útil antes de exportar os dados ou quando operações seguintes esperam rótulos em colunas comuns.

O exemplo seguinte cria o DataFrame de pessoas e, depois, forma índices com uma coluna e com duas colunas. Também mostra como manter a coluna de nomes enquanto a usa como rótulo das linhas. Os nomes das colunas apresentados no exemplo permanecem em inglês.

import pandas as pd

people = pd.DataFrame({
    "Name": ["Alice", "Bob", "Charlie"],
    "City": ["New York", "Los Angeles", "Chicago"],
    "Age": [25, 30, 35],
})

by_name = people.set_index("Name")
by_city_and_age = people.set_index(["City", "Age"])
with_name_column = people.set_index("Name", drop=False)

print(by_name)

Aqui, by_name tem os nomes como rótulos das linhas e mantém City e Age como colunas de dados. by_city_and_age usa ambas as colunas selecionadas como MultiIndex, enquanto with_name_column usa os nomes como rótulos e também mantém a coluna Name. As atribuições criam DataFrames separados, pelo que people continua disponível com as colunas originais e o índice predefinido. A instrução de impressão apresenta o resultado com uma única coluna; pode inspecionar as outras duas variáveis da mesma forma. Para restaurar um índice inteiro regular e colocar os valores do índice de volta em colunas, chame by_name.reset_index(); isto devolve outro DataFrame. Pode atribuir esse resultado se quiser continuar a trabalhar com a versão cujo índice foi reposto. Os nomes das colunas apresentados continuam em inglês.

Definir o índice ao ler um ficheiro CSV ou Excel com index_col

Quando a origem dos dados é um ficheiro, selecione o índice durante a leitura. Este exemplo autónomo de CSV usa os mesmos nomes de coluna e registos do DataFrame acima. StringIO permite que read_csv leia diretamente o texto de exemplo. Se tiver um CSV no disco, pode adaptar a chamada substituindo-o por um caminho de ficheiro, como "people.csv":

from io import StringIO
import pandas as pd

csv_data = StringIO("""Name,City,Age
Alice,New York,25
Bob,Los Angeles,30
Charlie,Chicago,35
""")
people = pd.read_csv(csv_data, index_col="Name")

print(people)

O argumento index_col="Name" seleciona a coluna pelo cabeçalho, pelo que o índice resultante e as restantes colunas de dados correspondem a by_name no primeiro exemplo. Em alternativa, um valor numérico para index_col seleciona uma coluna pela sua posição, começando em zero; a primeira coluna está na posição 0. Usar o nome do cabeçalho torna a escolha explícita e menos dependente da ordem das colunas. Para selecionar várias colunas, passe uma lista, como index_col=["City", "Age"], e crie um MultiIndex durante a importação. Para um livro Excel, use a chamada correspondente pd.read_excel("people.xlsx", index_col="Name"). O livro tem de estar disponível e o pandas precisa de ter instalado um motor Excel adequado para ler o respetivo formato. A chamada de Excel é apresentada como exemplo, pois não foi fornecido nenhum livro. Se um cabeçalho estiver mal escrito ou a ordem das colunas no ficheiro mudar, confirme os nomes das colunas antes de escolher o índice, para garantir que seleciona o campo pretendido. Os nomes das colunas apresentados nos exemplos permanecem em inglês.