Corso
Dopo aver manipolato e filtrato un grande dataset, potresti ottenere esattamente il DataFrame di cui hai bisogno. Tuttavia, questo DataFrame mantiene l'indice originale, che può non essere sequenziale. In questi casi, devi reimpostare l'indice del DataFrame.
In questo tutorial parleremo del metodo pandas reset_index(), usato per reimpostare l'indice di un DataFrame. Esploreremo le diverse opzioni disponibili con questo metodo. Inoltre, vedremo come reimpostare l'indice per DataFrame semplici e multilivello.
Per esercitarti a reimpostare l'indice di un DataFrame, useremo un dataset di compagnie aeree. Useremo Datalab di Datacamp, un ambiente interattivo progettato appositamente per la data analysis in Python, perfetto per seguire questo tutorial.
Che cos'è reset_index?
Il metodo reset_index in Pandas reimposta l'indice di un DataFrame a quello predefinito. Dopo operazioni come filtraggio, concatenazione o merge, l'indice potrebbe non essere più sequenziale. Questo metodo aiuta a ripristinare un indice pulito e sequenziale. Se il DataFrame ha un MultiIndex, può rimuovere uno o più livelli.
Sintassi di base:
df.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill="")
Parametri:
- level: In un DataFrame multilivello, accetta un nome di livello o una posizione dell'indice di riga che deve essere rimosso dall'indice. Per impostazione predefinita, rimuove tutti i livelli.
- drop: Flag booleano. True – L'attuale indice di riga non viene aggiunto come nuova colonna nel DataFrame. False (default) – L'attuale indice di riga viene aggiunto come nuova colonna nel DataFrame.
- inplace: Specifica se restituire un nuovo DataFrame o aggiornare quello esistente. È un flag booleano con valore predefinito False.
- col_level: Se le colonne hanno più livelli, determina in quale livello inserire le etichette. Per impostazione predefinita, sono inserite nel primo livello.
- col_fill: Se le colonne hanno più livelli, determina come nominare gli altri livelli. Se None, il nome dell'indice viene ripetuto.
Restituisce:
DataFrame con il nuovo indice o None se inplace=True.
Come usare reset_index
Se leggi un file CSV usando il metodo pandas read_csv() senza specificare un indice, il DataFrame risultante avrà un indice predefinito basato su interi a partire da 0 e incrementato di 1 per ogni riga successiva.
import pandas as pd
df = pd.read_csv("airlines_dataset.csv").head()
df

In alcuni casi, potresti preferire etichette di riga più descrittive. Per ottenerle, puoi impostare una delle colonne del DataFrame come indice (etichette di riga). Quando usi il metodo read_csv() per caricare dati da un file CSV, specifica la colonna desiderata per l'indice usando il parametro index_col.
import pandas as pd
df = pd.read_csv("airlines_dataset.csv", index_col="Operating Airline IATA Code").head()
df

In alternativa, puoi usare il metodo set_index() per impostare come indice qualsiasi colonna di un DataFrame:
import pandas as pd
df = pd.read_csv("airlines_dataset.csv").head()
df.set_index("Operating Airline IATA Code", inplace=True)
df
Nota che lo snippet di codice apporterà modifiche al DataFrame originale.

E se avessi bisogno di ripristinare l'indice numerico predefinito? Qui entra in gioco il metodo di Pandas reset_index().
df.reset_index()

L'esempio mostra che, dopo aver impostato la colonna 'Operating Airline IATA Code' come indice, reset_index viene usato per riportare il DataFrame al suo indice intero predefinito.
Applicazioni pratiche di reset_index
Il metodo reset_index() in Pandas è un potente strumento per riorganizzare gli indici dei DataFrame quando lavori con dataset filtrati, DataFrame concatenati o indici multilivello.
Approfondisci il reshaping dei DataFrame da formato wide a long, come impilare e disimpilare righe e colonne e come gestire DataFrame multi-index nel nostro corso online.
Reimpostare dopo il filtraggio
Quando filtri un DataFrame, l'indice originale viene mantenuto. Usando reset_index, puoi reindicizzare il DataFrame filtrato.
import pandas as pd
df = pd.read_csv("airlines_dataset.csv")
Filtriamo i dati per selezionare solo le righe in cui il "landing count" è maggiore di 1000. Dopo il filtraggio, gli indici potrebbero non essere sequenziali. Quindi puoi usare il metodo reset_index per reimpostare l'indice del DataFrame filtrato.
filtered_df = df[df["Landing Count"] > 1000].head()
filtered_df

L'immagine sopra mostra che il data frame è stato filtrato in base alla condizione applicata, ma l'indice non è sequenziale. Ora, usiamo reset_index per reindicizzare il DataFrame filtrato e garantire un indice sequenziale. Ecco come fare:
filtered_df_reset = filtered_df.reset_index()
filtered_df_reset

Il comportamento predefinito di questo metodo include la sostituzione dell'indice esistente del DataFrame con uno predefinito basato su interi e la conversione del vecchio indice in una nuova colonna con lo stesso nome (o "index" se era senza nome).
Quindi, usa il parametro drop=True, che assicura che il vecchio indice non venga aggiunto come nuova colonna.
filtered_df_reset = filtered_df.reset_index(drop=True)
filtered_df_reset

Ottimo! Gli indici sono ora reimpostati all'indice intero predefinito (0, 1, 2, …), offrendo un indice pulito e sequenziale.
Concatenazione o merge
Quando combini DataFrame, il DataFrame risultante potrebbe contenere indici duplicati o non sequenziali. Reimpostare l'indice crea un indice pulito e sequenziale.
Supponiamo che tu abbia due DataFrame e voglia concatenarli. Ho creato due DataFrame dal dataset delle compagnie aeree a scopo dimostrativo.
import pandas as pd
df = pd.read_csv("airlines_dataset.csv")
split_index = int(df.shape[0] / 2)
df1 = df[:split_index].head()
df2 = df[split_index:].head()
Ecco df1:

Ecco df2:

Concatenamo i DataFrame df1 e df2.
df_concat = pd.concat([df1, df2])

I dati mostrano indici non sequenziali. Dobbiamo reimpostare l'indice del DataFrame concatenato per renderlo sequenziale.
Reimpostiamo l'indice del DataFrame usando il metodo reset_index() in pandas.
df_concat.reset_index()

Ecco il risultato dopo la reimpostazione dell'indice del DataFrame. Il metodo reset_index converte il vecchio indice in una nuova colonna. Per rimuovere questa colonna extra, devi usare il parametro drop=True.
df_concat.reset_index(drop=True)

Gestione dell'indicizzazione multilivello
Per i DataFrame con indicizzazione gerarchica (multilivello), reset_index può essere usato per semplificare il DataFrame convertendo l'indice multilivello in colonne.
Vediamo un esempio di DataFrame con un indice multilivello.
import pandas as pd
df = pd.read_csv(
"airlines_dataset.csv", index_col=["Aircraft Model", "Operating Airline IATA Code"]
).head()

Se controlli il suo indice, vedrai che non è un indice comune di DataFrame ma un oggetto MultiIndex

Ora, usiamo il metodo pandas reset_index(), che rimuove tutti i livelli di un MultiIndex:
df.reset_index()

Puoi vedere che entrambi i livelli del MultiIndex sono convertiti in comuni colonne del DataFrame mentre l'indice viene reimpostato a quello predefinito basato su interi.
Puoi anche usare il parametro level per rimuovere livelli selezionati dall'indice del DataFrame. Converte i livelli selezionati in normali colonne del DataFrame, a meno che tu non scelga di eliminare completamente queste informazioni dal DataFrame usando il parametro drop. Vediamolo:
df.reset_index(level=["Aircraft Model"])

L'immagine sopra mostra che "Aircraft Model" è ora una colonna normale del DataFrame. Solo "Operating Airline IATA Code" resta come indice.
Ora, se non vuoi che l'indice indicato nella lista diventi una colonna normale, puoi combinare i parametri drop e level per eliminarlo dal DataFrame.
df.reset_index(level=["Aircraft Model"], drop=True)

L'indice 'Aircraft Model' è stato rimosso dall'indice e dal DataFrame. L'altro indice, 'Operating Airline IATA Code', è stato mantenuto come indice corrente del DataFrame.
Uso avanzato e suggerimenti
Preservare l'indice
Supponi di unire due DataFrame; il DataFrame unito risultante non avrà più indici sequenziali, come mostrato nel DataFrame qui sotto.

Reimpostiamo l'indice del DataFrame usando il metodo reset_index() di pandas.
df.reset_index()

Il parametro drop determina se mantenere il vecchio indice come colonna nel DataFrame dopo la reimpostazione dell'indice o eliminarlo completamente. Per impostazione predefinita (drop=False), il vecchio indice viene mantenuto, come mostrato in tutti gli esempi precedenti. In alternativa, impostando drop=True il vecchio indice viene rimosso dal DataFrame dopo la reimpostazione.
df.reset_index(drop=True)

Operazione inplace
Modifica il DataFrame in place usando il parametro inplace per evitare di creare un nuovo DataFrame.
Supponi di avere il seguente DataFrame:

Impostare il parametro inplace su True assicura che le modifiche vengano applicate direttamente al DataFrame originale, evitando la creazione di un DataFrame separato.
df_concat.reset_index(drop=True, inplace=True)
df_concat

Gestione dei duplicati
Gestisci indici duplicati reimpostando e reindicizzando in modo appropriato.
Supponi di avere dati con indici duplicati.

Usare reset_index() con drop=True e inplace=True garantisce che il DataFrame risultante avrà indici continui, a partire da 0 e in aumento sequenziale.
df.reset_index(drop=True, inplace=True)

Pandas reset_index: errori comuni e troubleshooting
- Indice non si reimposta: Assicurati di non usare il parametro
inplace=Falsese ti aspetti che il DataFrame originale venga modificato. Seinplaceè impostato suFalse, viene restituito un nuovo DataFrame e l'originale resta invariato. - Perdita di dati: Fai attenzione al parametro
dropper evitare perdite di dati involontarie. L'eliminazione dell'indice rimuoverà in modo permanente i valori dell'indice corrente.
Esempio pratico di reset_index
Applichiamo quanto abbiamo imparato sulla reimpostazione dell'indice del DataFrame e vediamo come reimpostare l'indice possa essere utile quando si eliminano valori mancanti.
Il nostro dataset delle compagnie aeree non ha valori mancanti, quindi usiamo invece il dataset Film e serie TV su Netflix. Ha valori mancanti, perfetto per dimostrare reset_index().
import pandas as pd
df = pd.read_csv("netflix_shows.csv")
df.head()

Puoi vedere che ci sono valori mancanti nel DataFrame. Elimina le righe contenenti valori mancanti usando il metodo dropna().
df.dropna(inplace=True)
df.head()

Le righe contenenti valori NaN sono state rimosse dal DataFrame. Tuttavia, l'indice non è più continuo (0, 1, 2, 4). Reimpostiamolo:
df.reset_index()

Ora l'indice è continuo; tuttavia, poiché non abbiamo passato esplicitamente il parametro drop, il vecchio indice è stato convertito in una colonna con il nome predefinito index. Eliminiamo completamente il vecchio indice dal DataFrame:
df.reset_index(drop=True)

Abbiamo rimosso completamente il vecchio indice non significativo e l'indice attuale è ora continuo. L'ultimo passaggio è salvare queste modifiche nel nostro DataFrame originale usando il parametro inplace:
df.reset_index(drop=True, inplace=True)
Conclusione
Hai imparato come la funzione reset_index in Pandas gestisce in modo efficiente gli indici dei DataFrame. Che tu stia gestendo dati filtrati, DataFrame concatenati o un indicizzazione multilivello complessa, reset_index assicura un DataFrame pulito e organizzato. I suoi parametri aiutano a gestire diversi scenari di indicizzazione nelle attività di manipolazione dei dati.
Continua a imparare funzioni simili a reset_index con il percorso di carriera Data Analyst with Python di DataCamp. Puoi anche leggere il nostro Tutorial su Python List Index() se stai lavorando con le liste e vuoi imparare la funzione index() applicata alle liste.


