Возврат из мультииндекса в единый индексный фрейм в pandas

                       NI
YEAR MONTH datetime        
2000 1     2000-01-01   NaN
           2000-01-02   NaN
           2000-01-03   NaN
           2000-01-04   NaN
           2000-01-05   NaN

В приведенном выше кадре данных у меня есть многоуровневый индекс, состоящий из столбцов:

names=[u'YEAR', u'MONTH', u'datetime']

Как мне вернуться к фрейму данных с "datetime" в качестве индекса и "YEAR" и "MONTH" в качестве обычных столбцов?

Ответ 1

пройти level=[0,1] чтобы просто сбросить эти уровни:

dist_df = dist_df.reset_index(level=[0,1])

In [28]:
df.reset_index(level=[0,1])

Out[28]:
            YEAR  MONTH  NI
datetime                     
2000-01-01  2000      1   NaN
2000-01-02  2000      1   NaN
2000-01-03  2000      1   NaN
2000-01-04  2000      1   NaN
2000-01-05  2000      1   NaN

Вы можете передать имена меток альтернативно:

df.reset_index(level=['YEAR','MONTH'])

Ответ 2

Начиная с версии 0.24.0 для панд, .to_flat_index() является "официальным" способом для панды делать то, что написано на этикетке: выравнивание MultiIndex.

Он также имеет дополнительное преимущество по сравнению с существующими ответами, такими как .reset_index(level=[0,1]), поскольку он достаточно универсален, чтобы применять его как к строке, так и к столбцу MultiIndex.

Из panda собственная документация:

MultiIndex.to_flat_index()

Преобразуйте MultiIndex в индекс кортежей, содержащий значения уровня.

Простой пример из своей документации:

import pandas as pd
print(pd.__version__) # '0.23.4'
index = pd.MultiIndex.from_product(
        [['foo', 'bar'], ['baz', 'qux']],
        names=['a', 'b'])

print(index)
# MultiIndex(levels=[['bar', 'foo'], ['baz', 'qux']],
#           codes=[[1, 1, 0, 0], [0, 1, 0, 1]],
#           names=['a', 'b'])
Applying to_flat_index():

index.to_flat_index()
# Index([('foo', 'baz'), ('foo', 'qux'), ('bar', 'baz'), ('bar', 'qux')], dtype='object')

Использование его для замены существующего столбца панд работает в основном так же, как и индекс:

dat = df.loc[:,['name','workshop_period','class_size']].groupby(['name','workshop_period']).describe()
print(dat.columns)
# MultiIndex(levels=[['class_size'], ['count', 'mean', 'std', 'min', '25%', '50%', '75%', 'max']],
#            codes=[[0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6, 7]])

dat.columns = dat.columns.to_flat_index()
print(dat.columns)
# Index([('class_size', 'count'),  ('class_size', 'mean'),
#     ('class_size', 'std'),   ('class_size', 'min'),
#     ('class_size', '25%'),   ('class_size', '50%'),
#     ('class_size', '75%'),   ('class_size', 'max')],
#  dtype='object')