取消透视/带有MultiIndex列和行的melt()Pandas DataFrame时缺少索引

时间:2018-11-25 03:44:18

标签: python pandas dataframe unpivot

我想“展平”一个现有的数据框并遇到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正确返回索引。我在做什么错??

1 个答案:

答案 0 :(得分:3)

您需要reset_index索引,并在melt中以索引名称传递

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