【问题标题】:Missing index when unpivotting / melt() Pandas DataFrame with MultiIndex columns and rows使用 MultiIndex 列和行取消透视/融化() Pandas DataFrame 时缺少索引
【发布时间】:2018-11-25 03:44:18
【问题描述】:

我想“展平”现有的 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 正确返回索引。我做错了什么??

【问题讨论】:

    标签: python pandas dataframe unpivot


    【解决方案1】:

    您需要reset_index 索引,并在melt 中使用索引名称传递id

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

    【讨论】:

    • D'oh...你不也觉得这有点不直观吗?
    猜你喜欢
    • 1970-01-01
    • 2017-03-02
    • 2012-10-02
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多