重塑多索引 pandas 数据框

Reshaping a multiindex pandas dataframe

我有一个多索引 pandas 数据框,看起来像这样

 ID            I                   II                  III
 METRIC        a    b    c    d    a    b    c    d    a    b    c    d
 2015-08-01    0    1    2    3    20   21   22   23   40   41   42   43
 2015-08-02    4    5    6    7    24   25   26   27   44   45   46   47
 2015-08-03    8    9    10   11   28   29   30   31   48   49   50   51

其中由日期(2015-08-012015-08-022015-08-03 等)、第一级列(III, III) 是 ID 和二级列对应 METRICs (a, b, c, d).我想将其重塑为以下形式

METRIC               a    b    c    d
ID
I      2015-08-01    0    1    2    3
       2015-08-02    4    5    6    7
       2015-08-03    8    9    10   11
II     2015-08-01    20   21   22   23
       2015-08-02    24   25   26   27
       2015-08-03    28   29   30   31
III    2015-08-01    40   41   42   43
       2015-08-02    44   45   46   47
       2015-08-03    48   49   50   51

我已经(未成功)研究过使用 .pivot.stack.melt,但它们没有给我想要的东西。我目前循环遍历 IDs 并构建一个 list 数据帧并将它们 concat 作为一个新的数据帧来获得我想要的。

如有任何建议,我们将不胜感激。

让我们使用 stackswaplevelsort_index

df.stack(0).swaplevel(0,1).sort_index()

输出:

METRIC           a   b   c   d
ID                            
I   2015-08-01   0   1   2   3
    2015-08-02   4   5   6   7
    2015-08-03   8   9  10  11
II  2015-08-01  20  21  22  23
    2015-08-02  24  25  26  27
    2015-08-03  28  29  30  31
III 2015-08-01  40  41  42  43
    2015-08-02  44  45  46  47
    2015-08-03  48  49  50  51

您可以让 transposeT 为您完成一些工作。

df.T.stack().unstack(1)

METRIC           a   b   c   d
ID                            
I   2015-08-01   0   1   2   3
    2015-08-02   4   5   6   7
    2015-08-03   8   9  10  11
II  2015-08-01  20  21  22  23
    2015-08-02  24  25  26  27
    2015-08-03  28  29  30  31
III 2015-08-01  40  41  42  43
    2015-08-02  44  45  46  47
    2015-08-03  48  49  50  51

使用@piRSquared的方法,我们可以跳过转置,只是df.unstack().unstack(1)