Add all levels of MultiIndex

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 to stack all levels MultiIndexwithout knowing how many level columns it 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
+6
source share
2 answers

You can first find the lenlevels, receive rangeand transfer it 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
+5
source

If you name index levels, you can use a list of names, for example:

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)

result:

   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
+1
source

All Articles