Cambiare l'indice di un dataframe in pandas e i suoi vantaggi

Quando generiamo un dataframe o importiamo un set di dati con pandas, esso si arricchisce automaticamente di una colonna che funge da “indice”. In questo breve articolo vedremo insieme come attribuire la funzione di indice a un’altra colonna (o a più colonne) e soprattutto quali sono i vantaggi di questa operazione.

La colonna indice

Facciamo un esempio pratico importando in pandas un file CSV che contiene un elenco delle piattaforme marine presenti a meno di 12 miglia dalle coste italiane, stilato dal Ministero Dello Sviluppo Economico nel 2016. Il nostro set di dati, visualizzato con un programma di foglio di calcolo, si presenta con questo aspetto:

Immagine 1

Importando il file CSV in pandas (come spiegato qui), ci troveremo di fronte ad un dataframe come questo:

Immagine 2

Immagine 2

Sorpresa! A sinistra della colonna “Denominazione” ne è comparsa un’altra, priva di titolo, contrassegnata da numeri. Si tratta della colonna indice del nostro dataframe.

Cambiare la colonna che funge da indice

Naturalmente vi è la possibilità di cambiare la colonna che svolge il ruolo di indice del nostro dataframe. Ci basta semplicemente utilizzare il metodo set_index().

df.set_index('Denominazione')

In questo modo, la colonna “Denominazione” è diventata l’indice del dataframe.

Immagine 3

Immagine 3

Impostare più colonne come indici del dataframe

È possibile avere più colonne che fungono da indice all’interno del nostro dataframe. Per farlo, non ci resta che scrivere una lista di colonne all’interno del metodo set_index().

df.set_index(['Denominazione','Codice'])

Così facendo, il nostro dataframe avrà questo aspetto:

Immagine 4

Immagine 4

Parametri addizionali di set_index()

Quando specifichiamo quale colonna vogliamo usare come indice, ci stiamo avvalendo di un parametro del metodo set_index() chiamato “keys”. Vediamo insieme quali altri parametri possiamo utilizzare per personalizzare al meglio l’indice (o gli indici) del nostro dataframe.

Altri parametri: drop

Come abbiamo potuto osservare nelle immagini 3 e 4, una volta che una colonna viene scelta per fungere da indice, essa scompare dal dataframe tradizionale. Questo accade perché il metodo set_index() prevede un parametro chiamato “drop” che, se non specificato, ha un valore preimpostato uguale a “True”. Questo significa che, impostando una colonna come indice, la eliminiamo dal resto del dataframe. Proviamo un attimo a cambiare il valore del parametro “drop”:

df.set_index(['Denominazione','Codice'], drop = False)

Il risultato sarà il seguente:

Immagine 5

Immagine 5

Come possiamo osservare, le colonne che abbiamo impostato come indici sono rimaste inalterate anche all’interno del dataframe.

Altri parametri: inplace

Il parametro “inplace” in realtà non è esclusivo del metodo set_index() ma la sua presenza è molto comune nella libreria pandas. Esso ci permette di rendere permanenti le modifiche appena apportate.

df.set_index(['Denominazione','Codice'], drop = False, inplace = True)

Così facendo, ogni qualvolta faremo riferimento al nostro dataframe in future, esso conserverà le modifiche apportate al suo indice.

Altri parametri: append

Nell’esempio qui in alto abbiamo deciso di avere due colonne che fungono da indice. Immaginiamo adesso di aver bisogno di aggiungerne una terza. Possiamo resettare l’indice e fare tutto da capo (come vedremo in seguito) o semplicemente utilizzare il parametro “append”.

df.set_index('Stato', drop = False, inplace = True, append = True)

Così facendo, abbiamo semplicemente aggiunto la colonna “Stato” alle due che fungevano da indice.

Immagine 6

Immagine 6

Altri parametri: verify_integrity

Di norma, ogni buon indice deve contenere dei valori unici per far sì sia preciso. Il dataframe raffigurato nell’immagine 6 ha tre indici. I primi due sono costituiti da colonne che hanno valori diversi in ogni riga, trattandosi di identificativi. La terza invece contiene molti duplicati, quindi, qualora fosse utilizzata da sola, potrebbe non essere adatta a fare da indice.

Quando non sappiamo se una colonna contiene o meno duplicati e desideriamo utilizzarla come indice, è buona norma usare il parametro "verify_integrity”. Esso ha un valore preimpostato uguale a “False”, quindi di solito non interviene. Proviamo a cambiarlo.

df.set_index(['Stato',], verify_integrity = True)

Il risultato sarà questo messaggio di errore, che esplicita la presenza di duplicati nella colonna “Stato”.

Immagine 7

Immagine 7

È possibile invece utilizzare la colonna “Stato” come indice in aggiunta alle colonne “Denominazione” e “Codice”. In questo caso, il parametro “verify_integrity” analizzerà i valori delle tre colonne (dato che tutte insieme costituiscono l’indice del dataframe). Dato che le colonne “Denominazione” e “Codice” non contengono duplicati, anche l’insieme di “Denominazione”, “Codice” e “Stato” non ne avrà. Di conseguenza, il parametro “verify_integrity” non ci darà un errore.

Resettare l’indice: reset_index()

Immaginiamo di voler annullare quanto fatto fin qui e fare a meno dell’indice dato da alcune colonne specifiche del nostro dataframe. In questo caso, possiamo usare semplicemente il metodo reset_index() come mostrato in questi esempi:

#se la colonna che funge da indice NON è più presente nel dataframe
df.reset_index()

#se la colonna che funge da indice è presente nel dataframe
df.reset_index(drop = True)

In sintesi, il metodo reset_index() sposta la colonna che fungeva da indice all’interno del dataframe. Qualora essa fosse già lì, bisogna specificare il valore “True” del parametro “drop” del metodo reset_index().

I vantaggi di impostare un indice per il dataframe

Se sei arrivato fin qui nella lettura, avrai capito come lavorare con gli indici con pandas (o almeno lo spero :) ), ma forse ti starai chiedendo a che serve.

Ecco qui una dimostrazione pratica: proveremo a cercare una riga del nostro dataframe prima basandoci sul valore di una colonna e poi sul valore della stessa colonna trasformata in indice.

Immagine 8

Immagine 8

Immagine 9

Immagine 9

Come possiamo vedere, quando cerchiamo una riga del dataframe basandoci sul valore dell’indice, il processo prende molto meno tempo. Quindi, se abbiamo bisogno di esplorare il nostro dataframe in maniera intensiva, è raccomandabile farlo avvalendosi di un indice.

Questo vale anche per tutte quelle operazione di unione di dataframe sui valori di determinate colonne: se si opera sull’indice, il processo risulta più veloce ed efficiente.