unpivotting 时缺少索引 / melt() Pandas DataFrame with MultiIndex columns and rows

Missing index when unpivotting / melt() Pandas DataFrame with MultiIndex columns and rows

我想 "flatten" 一个现有的 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

确切的顺序并不重要,但如果列名和行名保持不变就好了。 我无法 Pandas 正确地 return 索引。我做错了什么??

您需要 reset_index 索引,并使用索引名称

melt 中传递 ID
df.reset_index().melt(['omega1','omega2'])