HOWTO · Pandas
Imposta colonne come indice in Pandas Dataframe
Questo tutorial mostra come impostare le colonne come indice in un DataFrame Pandas con il metodo `set_index()` e usando il parametro `index_col` durante la lettura di un file.
In questa pagina
Un nuovo DataFrame Pandas usa un indice intero predefinito per identificare le righe. Per assegnare etichette di riga più significative, puoi chiamare set_index() su un DataFrame esistente oppure passare index_col a read_csv o read_excel durante il caricamento del file. Il primo approccio è utile quando i dati sono già in memoria; il secondo consente di scegliere le etichette durante l’importazione. Gli esempi seguenti usano lo stesso piccolo dataset di persone, così puoi confrontare i risultati. Scegli una colonna con valori che rendano le righe facili da identificare nell’analisi; un indice può contenere valori ripetuti, ma una ricerca tramite un’etichetta ripetuta può restituire più di una riga.
Impostare una colonna del DataFrame come indice con set_index()
set_index() è un metodo del DataFrame. Per impostazione predefinita, restituisce un nuovo DataFrame e rimuove la colonna selezionata dalle normali colonne dei dati. Assegna il risultato se vuoi lasciare invariato il DataFrame originale. Passa un elenco di nomi di colonna per creare un MultiIndex, che identifica ogni riga tramite una combinazione di valori. Usa drop=False se vuoi mantenere i valori selezionati anche come normali colonne dei dati.
Queste scelte cambiano il modo in cui accedi ai dati, non determinano se le righe vengono eliminate. Per esempio, mantieni una colonna con i nomi se il codice successivo deve usarla sia come etichetta sia come valore, oppure usa un MultiIndex basato su città ed età se questa coppia è utile per il tuo lavoro. Se vuoi modificare direttamente il DataFrame esistente, set_index(..., inplace=True) applica la modifica e restituisce None; di solito è più semplice da seguire assegnare il DataFrame restituito per impostazione predefinita, così puoi anche conservare l’originale. Per tornare a un indice normale, reset_index() inserisce i valori dell’indice corrente nelle colonne e, per impostazione predefinita, assegna al risultato un nuovo indice intero. È utile prima di esportare i dati o quando le operazioni successive si aspettano etichette nelle normali colonne.
L’esempio seguente crea il DataFrame delle persone, poi imposta l’indice usando una colonna e, in un altro caso, due colonne. Mostra anche come conservare la colonna dei nomi mentre la si usa per le etichette di riga.
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)
Qui, by_name usa i nomi come etichette di riga e mantiene City e Age come colonne dei dati. by_city_and_age usa entrambe le colonne selezionate per creare un MultiIndex, mentre with_name_column usa i nomi come etichette e conserva anche la colonna Name. Le assegnazioni creano DataFrame separati, quindi people resta disponibile con le colonne originali e l’indice predefinito. L’istruzione di stampa mostra il risultato con una sola colonna; puoi esaminare allo stesso modo le altre due variabili. Per ripristinare un indice intero normale e riportare i valori dell’indice nelle colonne, chiama by_name.reset_index(); il metodo restituisce un altro DataFrame. Se vuoi continuare a lavorare con la versione reimpostata, puoi assegnare il risultato.
Impostare l’indice durante la lettura di un file CSV o Excel con index_col
Se i dati provengono da un file, scegli l’indice mentre li leggi. Questo esempio CSV autonomo usa gli stessi nomi di colonna e gli stessi record del DataFrame precedente. StringIO permette a read_csv di leggere direttamente il testo di esempio; se hai un file CSV sul disco, puoi adattare la chiamata sostituendo il testo con un percorso come "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)
L’argomento index_col="Name" seleziona la colonna tramite la sua intestazione, quindi l’indice risultante e le colonne di dati rimanenti corrispondono a by_name del primo esempio. Un valore numerico per index_col seleziona invece una colonna in base alla sua posizione a partire da zero: la prima colonna è in posizione 0. Usare il nome dell’intestazione rende la scelta esplicita e meno dipendente dall’ordine delle colonne. Per selezionare più colonne, passa un elenco come index_col=["City", "Age"] e crea un MultiIndex durante l’importazione. Per un file Excel, usa la chiamata corrispondente pd.read_excel("people.xlsx", index_col="Name"). Il file deve essere disponibile e pandas deve avere installato un motore Excel adatto al suo formato. La chiamata Excel è mostrata come modello, perché qui non viene fornito alcun file. Se un’intestazione contiene un errore di battitura o cambia l’ordine delle colonne nel file, controlla i nomi delle colonne prima di scegliere l’indice, così da selezionare il campo desiderato.