Отсутствует индекс при отмене разворота / melt () Pandas DataFrame со столбцами и строками MultiIndex - PullRequest
0 голосов
/ 25 ноября 2018

Я хочу "сплющить" существующий Dataframe и наткнулся на команду Pandas melt().Это, кажется, оружие выбора здесь, но поведение немного неожиданно (по крайней мере для меня).Давайте начнем с довольно невинного MultiIndex DataFrame:

df = pd.DataFrame(np.random.randn(6, 6),
                  index=pd.MultiIndex.from_arrays([['X','X','X','Y','Y','Y'],
                                                   ['x','y','z','x','y','z']], 
                                                  names=['omega1', 'omega2']),
                  columns=pd.MultiIndex.from_arrays([['A','A','A','B','B','B'],
                                                     ['a','b','c','a','b','c']], 
                                                   names=['alpha1', 'alpha2']))

Дает хороший DataFrame вроде:

alpha1                A              ...            B          
alpha2                a         b    ...            b         c
omega1 omega2                        ...                       
X      x       2.362954  0.015595    ...     1.273841 -0.632132
       y      -0.134122  1.791614    ...     1.101646 -0.181099
       z       0.410267  1.063625    ...    -1.483590  0.521431
Y      x       0.001779 -0.076198    ...    -1.395494  1.177853
       y       0.453172  1.899883    ...     1.116654 -2.209697
       z       1.636227 -0.999949    ...     0.800413 -0.431485

Когда я сейчас делаю df.melt(), я получаю что-то вроде этого:

   alpha1 alpha2     value
0       A      a  2.362954
1       A      a -0.134122
2       A      a  0.410267
3       A      a  0.001779
...
33      B      c  1.177853
34      B      c -2.209697
35      B      c -0.431485

Однако я больше ожидаю чего-то подобного:

  omega1 omega2 alpha1 alpha2     value
0      X      x      A      a  2.362954
1      X      y      A      a -0.134122
2      X      z      A      a  0.410267
3      Y      x      A      a  0.001779
...
33     Y      x      B      c  1.177853
34     Y      y      B      c -2.209697
35     Y      z      B      c -0.431485

Точный порядок не имеет значения, но было бы неплохо, если бы имена столбцов и строк оставались неизменными.Я не могу заставить Панд правильно вернуть индекс вместе с ним.Что я делаю не так ??

1 Ответ

0 голосов
/ 25 ноября 2018

Вам нужно reset_index индексировать и передать идентификаторы в melt с именем индекса

df.reset_index().melt(['omega1','omega2'])
...