Поверните Pandas Multi-Index в столбец

У меня есть фреймворк с двумя уровнями индекса:

                         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 

Как я могу это сделать?

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

Ответ 1

Функция reset_index() - это метод pandas DataFrame, который будет передавать значения индекса в DataFrame в виде столбцов. Параметр по умолчанию для параметра: drop = False (который будет хранить значения индекса в виде столбцов).

Все, что вам нужно сделать, добавить .reset_index(inplace=True) после имени DataFrame:

df.reset_index(inplace=True)  

Ответ 2

Это на самом деле не относится к вашему делу, но может быть полезно знать другим (таким как я 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) будет работать как шарм.

Я столкнулся с этой проблемой после группировки по году и месяцу по столбцу datetime (не по индексу) с именем live_date, что означало, что и год, и месяц назывались live_date.

Ответ 3

Как упоминалось в комментарии @cs95, чтобы пропустить только один уровень, используйте:

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

Это позволяет избежать переопределения желаемого индекса после сброса.