2013-11-21 12 views
80

Mam dataframe z poziomami 2 Index:Turn pandy Multi-indeks do kolumny

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

którego chcę, aby włączyć do tego:

Trial measurement  value 

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

Jak mogę najlepiej to zrobić?

Potrzebuję tego, ponieważ chcę agregować dane as instructed here, ale nie mogę wybrać takich kolumn, jeśli są one używane jako indeksy.

+2

Duplikat: http://stackoverflow.com/questions/18624039/pandas-reset-index-on-series-to-remove-multiindex Potrzebujesz pierwszej sugestii. '.reset_index()' – TomAugspurger

+1

bardzo dziękuję, tak naprawdę przeglądałem to dużo, ale "rób wiele do kolumny", a podobne zapytania zawsze dawały mi wątki, które chciały obracać ich ramkami danych ... – TheChymera

+2

Zawsze łatwiej znaleźć odpowiedź, gdy już to wiesz :) – TomAugspurger

Odpowiedz

99

The reset_index() to pandowa metoda DataFrame, która przeniesie wartości indeksu do DataFrame jako kolumny. Domyślnym ustawieniem parametru jest drop = False (który zachowa wartości indeksu jako kolumny).

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

df.reset_index(inplace=True) 
5

To naprawdę nie stosuje się do sprawy, ale może to być pomocne dla innych (takich jak ja 5 minut temu) wiedzieć . Jeśli czyjeś multindex mają takie same nazwy jak to:

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

df.reset_index(inplace=True) będzie fail przyczyną kolumn, które jest stworzone nie mogą dzielić nazwy.

Więc trzeba zmienić nazwę multindex z df.index = df.index.set_names(['Trial', 'measurement']) dostać:

      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) będzie działać jak czar.

Napotkano ten problem po zgrupowaniu według roku i miesiąca w kolumnie datetime o nazwie live_date. Następnie zarówno rok, jak i miesiąc otrzymały nazwę live_date, a jedyne sugestie, jakie znalazłem, to zrzucenie jednego poziomu w indeksie, czego nie mogłem zrobić.