Перетворіть Pandas Multi-Index у стовпчик


155

У мене є кадр даних з 2 рівнями індексу:

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

Що я хочу перетворити на це:

Trial    measurement       value

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

Як я можу найкраще це зробити?

Мені це потрібно, тому що я хочу агрегувати дані, як вказано тут , але я не можу вибрати свої стовпці, якби вони використовувались як індекси.


2
Дублікат: stackoverflow.com/questions/18624039/… Ви хочете першу пропозицію. .reset_index()
TomAugspurger

1
велике спасибі, я насправді багато переглянув це, але "зробіть мультиіндекс до стовпця" і подібні запити завжди отримували мені теми, які хотіли повернути свої фрейми даних ...
TheChymera

3
Завжди простіше знайти відповідь, коли ви це вже знаєте :)
TomAugspurger

Відповіді:


192

Reset_index () являє собою метод панди DataFrame , який буде передавати значення індексу в DataFrame в вигляді стовпців. Стандартним параметром для параметра є drop = False (який зберігатиме значення індексу як стовпці).

Все, що вам потрібно зробити, додайте .reset_index(inplace=True)після імені DataFrame:

df.reset_index(inplace=True)  

3
У моєму випадку, коли у мене було 3 рівня індексу, зміни на місці не спрацювали. Альтернативою є присвоєння щойно встановленому фрейму даних для нового: df2 = df.reset_index ()
Gorkem

8
Щоб скинути лише певний рівень, використовуйтеdf.reset_index(level=[...])
cs95

20

Це насправді не стосується вашої справи, але може бути корисним для інших (як я 5 хвилин тому). Якщо мультиіндекс має те саме ім’я, як це:

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

df.reset_index(inplace=True) не вдасться, оскільки створені стовпці не можуть мати однакові назви.

Тоді вам потрібно перейменувати мультиіндекс, df.index = df.index.set_names(['Trial', 'measurement'])щоб отримати:

                           value
Trial    measurement       

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

І тоді df.reset_index(inplace=True)спрацює як шарм.

Я зіткнувся з цією проблемою після групування за роком та місяцем за стовпцем «timetime» (не індексом) live_date, який називався , і рік, і місяць були названі live_date.


1
Як змусити свої пробні значення повторитись? У мене була така ж проблема, і вона працює, за винятком того, що мої значення не повторюються.
Багатий

4

Як @ cs95 згадується в коментарі, щоб опустити лише один рівень, використовуйте:

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

Це дозволяє уникнути повторного визначення бажаного індексу після скидання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.