Trasforma l'Indice multiplo di Panda in colonna


156

Ho un dataframe con 2 livelli di indice:

                         value
Trial    measurement
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

Che voglio trasformare in questo:

Trial    measurement       value

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

Come posso farlo al meglio?

Ne ho bisogno perché voglio aggregare i dati come indicato qui , ma non posso selezionare le mie colonne in questo modo se sono in uso come indici.


2
Duplica: stackoverflow.com/questions/18624039/… Vuoi il primo suggerimento. .reset_index()
TomAugspurger,

1
molte grazie, in realtà ho cercato molto per questo, ma "crea multiindice su colonna" e query simili mi hanno sempre procurato discussioni che volevano ruotare i loro frame di dati ...
TheChymera

3
Sempre più facile trovare una risposta quando la conosci già :)
TomAugspurger

Risposte:


194

Il reset_index () è un metodo pandi dataframe che trasferirà valori dell'indice nel dataframe come colonne. L'impostazione predefinita per il parametro è drop = False (che manterrà i valori dell'indice come colonne).

Tutto quello che devi fare è aggiungere .reset_index(inplace=True)dopo il nome del DataFrame:

df.reset_index(inplace=True)  

3
Nel mio caso in cui avevo 3 livelli di indice sul posto, il ripristino non funzionava. L'alternativa sta assegnando un nuovo frame di dati reimpostato a uno nuovo: df2 = df.reset_index ()
Gorkem

8
Per ripristinare solo uno o più livelli particolari, utilizzaredf.reset_index(level=[...])
cs95

20

Questo non si applica al tuo caso, ma potrebbe essere utile per gli altri (come me 5 minuti fa). Se il proprio multindex ha lo stesso nome in questo modo:

                         value
Trial        Trial
    1              0        13
                   1         3
                   2         4
    2              0       NaN
                   1        12
    3              0        34 

df.reset_index(inplace=True) fallirà, perché le colonne create non possono avere gli stessi nomi.

Quindi è necessario rinominare il multindex con df.index = df.index.set_names(['Trial', 'measurement'])per ottenere:

                           value
Trial    measurement       

    1              0        13
    1              1         3
    1              2         4
    2              0       NaN
    2              1        12
    3              0        34 

E poi df.reset_index(inplace=True)funzionerà come un fascino.

Ho riscontrato questo problema dopo aver raggruppato per anno e mese su una colonna datetime (non indice) chiamata live_date, il che significava che venivano denominati sia l'anno che il mese live_date.


1
Come avere i valori di prova per ripetersi? Ho avuto lo stesso problema e funziona tranne i miei valori non si ripetono.
Ricco

4

Come @ cs95 menzionato in un commento, per eliminare solo un livello, utilizzare:

df.reset_index(level=[...])

Ciò evita di dover ridefinire l'indice desiderato dopo il ripristino.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.