In [1]:
import pandas as pd

In [2]:
df = pd.read_csv('data/src/sample_multi.csv')
print(df)


   level_1 level_2 level_3  val_1  val_2
0       A0      B0      C0     98     90
1       A0      B0      C1     44      9
2       A0      B1      C2     39     17
3       A0      B1      C3     75     71
4       A1      B2      C0      1     89
5       A1      B2      C1     54     60
6       A1      B3      C2     47      6
7       A1      B3      C3     16      5
8       A2      B0      C0     75     22
9       A2      B0      C1     19      4
10      A2      B1      C2     25     52
11      A2      B1      C3     57     40
12      A3      B2      C0     64     54
13      A3      B2      C1     27     96
14      A3      B3      C2    100     77
15      A3      B3      C3     22     50

In [3]:
df_m_csv = pd.read_csv('data/src/sample_multi.csv', index_col=['level_1', 'level_2', 'level_3'])
print(df_m_csv)


                         val_1  val_2
level_1 level_2 level_3              
A0      B0      C0          98     90
                C1          44      9
        B1      C2          39     17
                C3          75     71
A1      B2      C0           1     89
                C1          54     60
        B3      C2          47      6
                C3          16      5
A2      B0      C0          75     22
                C1          19      4
        B1      C2          25     52
                C3          57     40
A3      B2      C0          64     54
                C1          27     96
        B3      C2         100     77
                C3          22     50

In [4]:
df_m = df.set_index(['level_1', 'level_2', 'level_3'])
print(df_m)


                         val_1  val_2
level_1 level_2 level_3              
A0      B0      C0          98     90
                C1          44      9
        B1      C2          39     17
                C3          75     71
A1      B2      C0           1     89
                C1          54     60
        B3      C2          47      6
                C3          16      5
A2      B0      C0          75     22
                C1          19      4
        B1      C2          25     52
                C3          57     40
A3      B2      C0          64     54
                C1          27     96
        B3      C2         100     77
                C3          22     50

In [5]:
df_m_1 = df.set_index('level_1')
print(df_m_1)


        level_2 level_3  val_1  val_2
level_1                              
A0           B0      C0     98     90
A0           B0      C1     44      9
A0           B1      C2     39     17
A0           B1      C3     75     71
A1           B2      C0      1     89
A1           B2      C1     54     60
A1           B3      C2     47      6
A1           B3      C3     16      5
A2           B0      C0     75     22
A2           B0      C1     19      4
A2           B1      C2     25     52
A2           B1      C3     57     40
A3           B2      C0     64     54
A3           B2      C1     27     96
A3           B3      C2    100     77
A3           B3      C3     22     50

In [6]:
df_m_2 = df_m_1.set_index('level_2', append=True)
print(df_m_2)


                level_3  val_1  val_2
level_1 level_2                      
A0      B0           C0     98     90
        B0           C1     44      9
        B1           C2     39     17
        B1           C3     75     71
A1      B2           C0      1     89
        B2           C1     54     60
        B3           C2     47      6
        B3           C3     16      5
A2      B0           C0     75     22
        B0           C1     19      4
        B1           C2     25     52
        B1           C3     57     40
A3      B2           C0     64     54
        B2           C1     27     96
        B3           C2    100     77
        B3           C3     22     50

In [7]:
df_r_all = df_m.reset_index()
print(df_r_all)


   level_1 level_2 level_3  val_1  val_2
0       A0      B0      C0     98     90
1       A0      B0      C1     44      9
2       A0      B1      C2     39     17
3       A0      B1      C3     75     71
4       A1      B2      C0      1     89
5       A1      B2      C1     54     60
6       A1      B3      C2     47      6
7       A1      B3      C3     16      5
8       A2      B0      C0     75     22
9       A2      B0      C1     19      4
10      A2      B1      C2     25     52
11      A2      B1      C3     57     40
12      A3      B2      C0     64     54
13      A3      B2      C1     27     96
14      A3      B3      C2    100     77
15      A3      B3      C3     22     50

In [8]:
df_r_1 = df_m.reset_index(level='level_1')
print(df_r_1)


                level_1  val_1  val_2
level_2 level_3                      
B0      C0           A0     98     90
        C1           A0     44      9
B1      C2           A0     39     17
        C3           A0     75     71
B2      C0           A1      1     89
        C1           A1     54     60
B3      C2           A1     47      6
        C3           A1     16      5
B0      C0           A2     75     22
        C1           A2     19      4
B1      C2           A2     25     52
        C3           A2     57     40
B2      C0           A3     64     54
        C1           A3     27     96
B3      C2           A3    100     77
        C3           A3     22     50

In [9]:
df_r_1 = df_m.reset_index(level=0)
print(df_r_1)


                level_1  val_1  val_2
level_2 level_3                      
B0      C0           A0     98     90
        C1           A0     44      9
B1      C2           A0     39     17
        C3           A0     75     71
B2      C0           A1      1     89
        C1           A1     54     60
B3      C2           A1     47      6
        C3           A1     16      5
B0      C0           A2     75     22
        C1           A2     19      4
B1      C2           A2     25     52
        C3           A2     57     40
B2      C0           A3     64     54
        C1           A3     27     96
B3      C2           A3    100     77
        C3           A3     22     50

In [10]:
df_r_2 = df_m.reset_index(level=['level_1', 'level_2'])
print(df_r_2)


        level_1 level_2  val_1  val_2
level_3                              
C0           A0      B0     98     90
C1           A0      B0     44      9
C2           A0      B1     39     17
C3           A0      B1     75     71
C0           A1      B2      1     89
C1           A1      B2     54     60
C2           A1      B3     47      6
C3           A1      B3     16      5
C0           A2      B0     75     22
C1           A2      B0     19      4
C2           A2      B1     25     52
C3           A2      B1     57     40
C0           A3      B2     64     54
C1           A3      B2     27     96
C2           A3      B3    100     77
C3           A3      B3     22     50

In [11]:
df_r_drop = df_m.reset_index(level='level_1', drop=True)
print(df_r_drop)


                 val_1  val_2
level_2 level_3              
B0      C0          98     90
        C1          44      9
B1      C2          39     17
        C3          75     71
B2      C0           1     89
        C1          54     60
B3      C2          47      6
        C3          16      5
B0      C0          75     22
        C1          19      4
B1      C2          25     52
        C3          57     40
B2      C0          64     54
        C1          27     96
B3      C2         100     77
        C3          22     50

In [12]:
df_r_drop_sort = df_r_drop.sort_index()
print(df_r_drop_sort)


                 val_1  val_2
level_2 level_3              
B0      C0          98     90
        C0          75     22
        C1          44      9
        C1          19      4
B1      C2          39     17
        C2          25     52
        C3          75     71
        C3          57     40
B2      C0           1     89
        C0          64     54
        C1          54     60
        C1          27     96
B3      C2          47      6
        C2         100     77
        C3          16      5
        C3          22     50

In [13]:
df_r_drop_sort_2 = df_r_drop.sort_index(level='level_3')
print(df_r_drop_sort_2)


                 val_1  val_2
level_2 level_3              
B0      C0          98     90
        C0          75     22
B2      C0           1     89
        C0          64     54
B0      C1          44      9
        C1          19      4
B2      C1          54     60
        C1          27     96
B1      C2          39     17
        C2          25     52
B3      C2          47      6
        C2         100     77
B1      C3          75     71
        C3          57     40
B3      C3          16      5
        C3          22     50

In [14]:
print(df_m)


                         val_1  val_2
level_1 level_2 level_3              
A0      B0      C0          98     90
                C1          44      9
        B1      C2          39     17
                C3          75     71
A1      B2      C0           1     89
                C1          54     60
        B3      C2          47      6
                C3          16      5
A2      B0      C0          75     22
                C1          19      4
        B1      C2          25     52
                C3          57     40
A3      B2      C0          64     54
                C1          27     96
        B3      C2         100     77
                C3          22     50

In [15]:
df_m_swap = df_m.swaplevel('level_1', 'level_3')
print(df_m_swap)


                         val_1  val_2
level_3 level_2 level_1              
C0      B0      A0          98     90
C1      B0      A0          44      9
C2      B1      A0          39     17
C3      B1      A0          75     71
C0      B2      A1           1     89
C1      B2      A1          54     60
C2      B3      A1          47      6
C3      B3      A1          16      5
C0      B0      A2          75     22
C1      B0      A2          19      4
C2      B1      A2          25     52
C3      B1      A2          57     40
C0      B2      A3          64     54
C1      B2      A3          27     96
C2      B3      A3         100     77
C3      B3      A3          22     50

In [16]:
df_m_swap = df_m.swaplevel(0, 2)
print(df_m_swap)


                         val_1  val_2
level_3 level_2 level_1              
C0      B0      A0          98     90
C1      B0      A0          44      9
C2      B1      A0          39     17
C3      B1      A0          75     71
C0      B2      A1           1     89
C1      B2      A1          54     60
C2      B3      A1          47      6
C3      B3      A1          16      5
C0      B0      A2          75     22
C1      B0      A2          19      4
C2      B1      A2          25     52
C3      B1      A2          57     40
C0      B2      A3          64     54
C1      B2      A3          27     96
C2      B3      A3         100     77
C3      B3      A3          22     50

In [17]:
df_m_swap_sort = df_m.swaplevel('level_1', 'level_3').sort_index()
print(df_m_swap_sort)


                         val_1  val_2
level_3 level_2 level_1              
C0      B0      A0          98     90
                A2          75     22
        B2      A1           1     89
                A3          64     54
C1      B0      A0          44      9
                A2          19      4
        B2      A1          54     60
                A3          27     96
C2      B1      A0          39     17
                A2          25     52
        B3      A1          47      6
                A3         100     77
C3      B1      A0          75     71
                A2          57     40
        B3      A1          16      5
                A3          22     50

In [18]:
df_m_change = df_m.reset_index().set_index(['level_2', 'level_3', 'level_1']).sort_index()
print(df_m_change)


                         val_1  val_2
level_2 level_3 level_1              
B0      C0      A0          98     90
                A2          75     22
        C1      A0          44      9
                A2          19      4
B1      C2      A0          39     17
                A2          25     52
        C3      A0          75     71
                A2          57     40
B2      C0      A1           1     89
                A3          64     54
        C1      A1          54     60
                A3          27     96
B3      C2      A1          47      6
                A3         100     77
        C3      A1          16      5
                A3          22     50