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

156

У меня есть датафрейм с 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 

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

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

TheChymera
источник
2
Дубликат: stackoverflow.com/questions/18624039/… Вы хотите первое предложение. .reset_index()
TomAugspurger
1
большое спасибо, я на самом деле много об этом просматривала, но «сделать мультииндекс для столбца» и подобные запросы всегда
вызывали у
3
Всегда легче найти ответ, когда вы его уже знаете :)
TomAugspurger

Ответы:

194

Reset_index () представляет собой метод панды DataFrame , который будет передавать значение индекса в DataFrame в виде столбцов. Значением по умолчанию для параметра является drop = False (значения индекса будут сохранены в виде столбцов).

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

df.reset_index(inplace=True)  
CraigSF
источник
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)будет работать как шарм.

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

Карл Анка
источник
1
Как сделать так, чтобы ваши пробные значения повторялись? У меня была та же проблема, и она работает, за исключением того, что мои ценности не повторяются.
Богатое
4

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

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

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

sameagol
источник