【问题标题】:stack all levels of a MultiIndex堆叠 MultiIndex 的所有级别
【发布时间】:2016-11-13 20:34:05
【问题描述】:

我有一个数据框:

index = pd.MultiIndex.from_product([['a', 'b'], ['A', 'B'], ['One', 'Two']])
df = pd.DataFrame(np.arange(16).reshape(2, 8), columns=index)
df

如何在不知道列有多少级别的情况下堆叠MultiIndex 的所有级别。

我希望结果如下所示:

0  a  A  One     0
         Two     1
      B  One     2
         Two     3
   b  A  One     4
         Two     5
      B  One     6
         Two     7
1  a  A  One     8
         Two     9
      B  One    10
         Two    11
   b  A  One    12
         Two    13
      B  One    14
         Two    15
dtype: int64

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    如果为索引级别命名,可以使用名称列表,如下所示:

    index = pd.MultiIndex.from_product(
        [['a', 'b'], ['A', 'B'], ['One', 'Two']], 
        names=['idx1', 'idx2', 'idx3']
    )
    df = pd.DataFrame(np.arange(16).reshape(2, 8), columns=index)
    df.stack(index.names)
    

    结果:

       idx1  idx2  idx3
    0  a     A     One      0
                   Two      1
             B     One      2
                   Two      3
       b     A     One      4
                   Two      5
             B     One      6
                   Two      7
    1  a     A     One      8
                   Two      9
             B     One     10
                   Two     11
       b     A     One     12
                   Two     13
             B     One     14
                   Two     15
    dtype: int64
    

    【讨论】:

    • 嘿!不错的答案。 ?
    【解决方案2】:

    你可以先找到len的关卡,得到range传给stack

    print (df.columns.nlevels)
    3
    
    print (list(range(df.columns.nlevels)))
    [0, 1, 2]
    
    print (df.stack(list(range(df.columns.nlevels))))
    0  a  A  One     0
             Two     1
          B  One     2
             Two     3
       b  A  One     4
             Two     5
          B  One     6
             Two     7
    1  a  A  One     8
             Two     9
          B  One    10
             Two    11
       b  A  One    12
             Two    13
          B  One    14
             Two    15
    dtype: int32
    

    【讨论】:

    • 我在isinstance(df.columns, pd.MultiIndex) 上做了一个 if/else。我不知道 nlevels。​​
    • df.stack(range(df.columns.nlevels)) 在 python 3 中会失败吗?请注意,我删除了对 list 的调用。
    • 是的,它返回错误KeyError: 'Level range(0, 3) not found'
    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 2012-12-20
    • 2020-02-14
    • 2017-02-16
    • 2013-09-19
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多