Skip to content

pandas: Assegnare una colonna esistente all’indice del DataFrame con set_index()

Python

Usando set_index(), puoi concedere una colonna esistente di pandas.Datame a index (etichetta di riga). L’impostazione di nomi univoci per l’indice semplifica la selezione degli elementi con loc e at.

In questo articolo vengono descritti i seguenti contenuti.

  • Vieni a usare set_index()
    • Utilizzo di base
    • Mantieni la colonna specificata:drop
    • Assegna multiindice
    • Mantieni l’indice originale come una colonna
    • Cambia oggetto originale:inplace
  • Imposta l’indice durante la lettura del file CSV
  • Seleziona righe ed elementi usando index

Vedere l’articolo seguente per come rinominare l’indice invece di trasmettere una colonna esistente all’indice.

I seguenti dati sono usati come esempio.

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal.csv')
print(df)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

Vieni a usare set_index()

Utilizzo di base

Specificare il nome della colonna da utilizzare come indice nelle prime chiavi di argomento.

df_i = df.set_index('name')
print(df_i)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

Mantieni la colonna specificata: :drop

Per impostazione predefinita, la colonna specificata viene eliminata, come mostrato nell’esempio precedente. Se l’argomento drop è impostato su False, la colonna specificata viene impostata su index e rimane nella colonna di dati.

df_id = df.set_index('name', drop=False)
print(df_id)
#             name  age state  point
# name                              
# Alice      Alice   24    NY     64
# Bob          Bob   42    CA     92
# Charlie  Charlie   18    CA     70
# Dave        Dave   68    TX     70
# Ellen      Ellen   24    CA     88
# Frank      Frank   30    NY     57

Assegna multiindice

utilizzando set_index(), più colonne possono essere assegnate come multi-indice.

Specificare per elenco

Specificando un elenco di nomi di colonna nelle prime chiavi di argomento, più colonne vengono assegnate come multi-indice.

df_mi = df.set_index(['state', 'name'])
print(df_mi)
#                age  point
# state name               
# NY    Alice     24     64
# CA    Bob       42     92
#       Charlie   18     70
# TX    Dave      68     70
# CA    Ellen     24     88
# NY    Frank     30     57

L’ordinamento con sort_index() lo rende in modo ordinato.

df_mi.sort_index(inplace=True)
print(df_mi)
#                age  point
# state name               
# CA    Bob       42     92
#       Charlie   18     70
#       Ellen     24     88
# NY    Alice     24     64
#       Frank     30     57
# TX    Dave      68     70

Vedere il seguente articolo per i dettagli sull’ordinamento con sort_values() e sort_index().

Aggiungi una colonna al multiindice:append

Per impostazione predefinita, specificando una nuova colonna con set_index() si elimina l’indice originale.

print(df_i)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

df_ii = df_i.set_index('state')
print(df_ii)
#        age  point
# state            
# NY      24     64
# CA      42     92
# CA      18     70
# TX      68     70
# CA      24     88
# NY      30     57

Se l’argomento append è impostato su True, la colonna specifica verrà aggiunta come nuovo indice di livello.

df_mi = df_i.set_index('state', append=True)
print(df_mi)
#                age  point
# name    state            
# Alice   NY      24     64
# Bob     CA      42     92
# Charlie CA      18     70
# Dave    TX      68     70
# Ellen   CA      24     88
# Frank   NY      30     57

La colonna aggiunta è impostata sul livello più basso. Se vuoi scambiare i livelli, usa swaplevel().

print(df_mi.swaplevel(0, 1))
#                age  point
# state name               
# NY    Alice     24     64
# CA    Bob       42     92
#       Charlie   18     70
# TX    Dave      68     70
# CA    Ellen     24     88
# NY    Frank     30     57

Mantieni l’indice originale come una colonna

Se imposti una colonna su index con set_index() come negli esempi precedenti, l’indice originale verrà eliminato.

Se vuoi mantenere l’indice originale come colonna, usa reset_index() per riassegnare l’indice a un numero sequenziale che inizia da 0.

print(df_i)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

df_ri = df_i.reset_index()
print(df_ri)
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

È possibile modificare l’indice utilizzando una colonna diversa set_index() dopo reset_index().

df_change = df_i.reset_index().set_index('state')
print(df_change)
#           name  age  point
# state                     
# NY       Alice   24     64
# CA         Bob   42     92
# CA     Charlie   18     70
# TX        Dave   68     70
# CA       Ellen   24     88
# NY       Frank   30     57

Vedi anche il seguente articolo per reset_index().

Cambia oggetto originale:inplace

Per configurare predefinito, set_index() non modifica l’oggetto originale e viene trasferito un nuovo oggetto, ma se l’argomento inplace è impostato su True, l’oggetto originale viene modificato.

df.set_index('name', inplace=True)
print(df)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

Imposta l’indice durante la lettura del file CSV

Quando si legge da un file CSV e si genera pandas.DataFrame o pandas.Series, se il file originale contiene una colonna che deve essere utilizzato come indice, può anche essere specificata durante la lettura.

Quando si legge un file con read_csv(), specificando il numero di colonna nell’argomento index_col imposta quella colonna sull’indice.。

df = pd.read_csv('data/src/sample_pandas_normal.csv', index_col=0)
print(df)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

Seleziona righe ed elementi usando index

Come negli esempi precedenti, se si specificano nomi univoci per l’indice, è possibile selezionare facilmente righe ed elementi in base al nome.

print(df)
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       42    CA     92
# Charlie   18    CA     70
# Dave      68    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57

print(df.loc['Bob'])
# age      42
# state    CA
# point    92
# Name: Bob, dtype: object

print(df.at['Bob', 'age'])
# 42

Vedere il seguente articolo per ulteriori informazioni su loc e at.