Jerzy
Jerzy

Reputation: 165

How to get index level0 from multiindexed dataframe by specifing level1, level2, level3?

My question is as in the title, so for example I would like to write dataframe.index.Magic_command[None,'valueA','row','p1'] and get value 'car', or dataframe.index.Magic_command[None,'valueC','row','p1','1'] and receive as output value bike

Here is the example code:

import numpy as np
import pandas as pd


# multiindex array
arr = [np.array(['car', 'car', 'car','car', 'car', 'car', 'car', 'car', 'car', 'truck', 'truck', 'truck', 'truck', 'truck', 'truck','truck', 'truck', 'truck','bike','bike', 'bike','bike','bike', 'bike','bike','bike', 'bike']),
       np.array(['valueA', 'valueA','valueA', 'valueA','valueA', 'valueA','valueA', 'valueA','valueA','valueB','valueB','valueB','valueB','valueB','valueB','valueB','valueB','valueB', 'valueC','valueC','valueC','valueC','valueC','valueC','valueC','valueC','valueC']),
       np.array(['row','row','row','row','row','row','row','row','row','row','row','row','row','row','row','row','row','row','row','row','row','row','row','row','row','row','row']),
       np.array(['p1','p1','p1','p2','p2','p2','p3','p3','p3','p1','p1','p1','p2','p2','p2','p3','p3','p3','p1','p1','p1','p2','p2','p2','p3','p3','p3',]),
       np.array(['1','2','3','1','2','3','1','2','3','1','2','3','1','2','3','1','2','3','1','2','3','1','2','3','1','2','3',])]

# forming multiindex dataframe
dataFrame = pd.DataFrame(
   np.random.randn(27, 3), index=arr,columns=['Col 1', 'Col 2', 'Col 3'])

dataFrame.index.names = ['level 0', 'level 1','level 2','level 3','level 4']
print(dataFrame)

From above I get this dataframe:

                                           Col 1     Col 2     Col 3
level 0 level 1 level 2 level 3 level 4                              
car     valueA  row     p1      1        0.088282  0.645195 -0.102823
                                2       -0.659527 -1.820909 -1.774308
                                3        0.859338  0.971282  0.517606
                        p2      1        1.205428 -0.277596  0.527442
                                2        0.366879  0.149401 -0.087129
                                3       -0.084490 -1.802438  2.000927
                        p3      1       -1.651197  0.340212 -2.170045
                                2        0.625551 -0.327191 -1.376346
                                3       -0.112555 -0.727614 -0.949196
truck   valueB  row     p1      1        0.735279  0.324148 -0.588617
                                2       -1.398363  0.056191 -0.051693
                                3       -1.948123  0.316405  1.127997
                        p2      1       -0.899230  0.552561 -0.014481
                                2       -1.159626 -1.008341  0.569346
                                3       -0.862040 -1.654220 -0.187640
                        p3      1        1.177478  0.563265 -0.799456
                                2        0.631338  0.660141  0.801916
                                3       -0.361715 -0.070938 -0.113358
bike    valueC  row     p1      1       -1.246785  0.344593 -1.363045
                                2        1.199800 -0.483610  0.385470
                                3       -0.820398  1.550655  2.625559
                        p2      1        0.772196  0.956007 -0.921774
                                2        1.102925  0.152290 -0.553291
                                3        0.538580  1.305551 -0.924003
                        p3      1       -0.025790 -0.134343  0.197256
                                2       -0.851465 -0.324827  0.057217
                                3       -0.994596  0.361060  0.797949

Upvotes: 0

Views: 139

Answers (1)

jezrael
jezrael

Reputation: 862511

Use DataFrame.loc with IndexSlice:

a = dataFrame.loc[pd.IndexSlice[:,'valueC','row','p1','1']].index[0]
print (a)
bike

Upvotes: 1

Related Questions