Zamień Pandas Multi-Index w kolumnę

155

Mam ramkę danych z 2 poziomami indeksu:

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

Które chcę zamienić w to:

Trial    measurement       value

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

Jak najlepiej to zrobić?

Potrzebuję tego, ponieważ chcę zagregować dane zgodnie z instrukcjami tutaj , ale nie mogę tak wybrać moich kolumn, jeśli są używane jako indeksy.

TheChymera
źródło
2
Duplikat: stackoverflow.com/questions/18624039/… Chcesz mieć pierwszą sugestię. .reset_index()
TomAugspurger
1
wielkie dzięki, właściwie to często przeglądałem, ale "make multiindex to column" i podobne zapytania zawsze powodowały, że otrzymywałem wątki, które chciały przestawić swoje ramki danych ...
TheChymera
3
Zawsze łatwiej jest znaleźć odpowiedź, kiedy już ją znasz :)
TomAugspurger

Odpowiedzi:

192

Reset_index () to metoda pandy DataFrame które przesyłania wartości indeksu w DataFrame postaci kolumn. Domyślne ustawienie parametru to drop = False (co spowoduje zachowanie wartości indeksu jako kolumn).

Wszystko, co musisz zrobić, dodaj .reset_index(inplace=True)po nazwie ramki DataFrame:

df.reset_index(inplace=True)  
CraigSF
źródło
3
W moim przypadku, w którym miałem 3 poziomy indeksu, reset w miejscu nie działał. Alternatywą jest przypisanie nowo zresetowanej ramki danych do nowej: df2 = df.reset_index ()
Gorkem
8
Aby zresetować tylko określone poziomy, użyjdf.reset_index(level=[...])
cs95
20

To naprawdę nie dotyczy twojego przypadku, ale może być pomocne dla innych (takich jak ja 5 minut temu), aby wiedzieć. Jeśli multindeks ma taką samą nazwę, jak ta:

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

df.reset_index(inplace=True) zakończy się niepowodzeniem, ponieważ utworzone kolumny nie mogą mieć takich samych nazw.

Więc musisz zmienić nazwę multindeksu z, df.index = df.index.set_names(['Trial', 'measurement'])aby uzyskać:

                           value
Trial    measurement       

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

A potem df.reset_index(inplace=True)zadziała jak urok.

Napotkałem ten problem po pogrupowaniu według roku i miesiąca w kolumnie datetime (nie indeksu) o nazwie live_date, co oznaczało, że nazwano zarówno rok, jak i miesiąc live_date.

Karl Anka
źródło
1
Jak sprawić, by Twoje wartości próbne się powtarzały? Miałem ten sam problem i działa, ale moje wartości się nie powtarzają.
Rich
4

Jak wspomniano w komentarzu @ cs95, aby obniżyć tylko jeden poziom, użyj:

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

Pozwala to uniknąć ponownego definiowania żądanego indeksu po zresetowaniu.

sameagol
źródło