【问题标题】:Reshaping a multiindex pandas dataframe重塑多索引熊猫数据框
【发布时间】:2017-12-14 09:45:02
【问题描述】:

我有一个看起来像这样的多索引 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 等),第一级列(IIIIII)是IDs而二级列对应的是METRICs(abcd)。我想将其重塑为以下

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 它们一起作为一个新的数据框来获得我想要的。

任何建议将不胜感激。

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    让我们使用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
    

    【讨论】:

    • 简单明了!!
    • @Wen 是的 :-)
    • 谢谢。我花了一段时间才理解这个过程,但现在它是有道理的。很好的解决方案:) 快速提问:在我的原始数据框中,一些IDs(比如V)有行(比如2015-08-02),其中所有METRICs 都是NaNs;这些被此解决方案删除。这是为什么呢?
    【解决方案2】:

    您可以让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
    

    【讨论】:

    • 哦.. 我喜欢在这里使用 T!不错,piRsquared 先生! +1
    • 谢谢。起初我尝试过转置,但我仍然不习惯使用stackunstack,所以我不知道如何重新排序。这个解决方案非常简洁和漂亮。快速提问:在我的原始数据框中,一些IDs(比如V)有行(比如2015-08-02),其中所有METRICs 都是NaNs;这些被此解决方案删除。这是为什么呢?
    • @darXider stack 将列对象中的级别放入索引对象中。当它这样做时,它会丢弃空值。您可以通过stack(dropna=False) 避免这种情况
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2019-06-30
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      相关资源
      最近更新 更多