stack all levels of a MultiIndex

时间:2016-07-11 19:26:03

标签: python pandas multi-index

I have a dataframe:

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

enter image description here

How do I stack all levels of the MultiIndex without knowing how many levels columns has.

I expect the results to look like this:

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 个答案:

答案 0 :(得分:4)

You can first find len of levels, get range and pass it to 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

答案 1 :(得分: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