Skip to content
Advertisement

How to test a set of values (not all) exist in a Pandas multiindex?

The isin() method applied to a Pandas index returns whether each index value is found in the passed set of values, but is there a possibility to test only a set of indexe values ?

In the multiIndex below I would like to test if an index with level name s1 and level value E and level name d1 and level value future exists. Problem is that I test index values that may not exist so selection method like xs or loc don’ work.

df_routes.index
MultiIndex([('E', 'future',       'B', 'future'),
            ('E', 'future',       'B5', 'future'),
            ('E', 'future',       'B',   'spot'),
            ('B', 'future',       'B', 'future'),
            ('B', 'future',       'B5', 'future'),
            ('B', 'future',       'B',   'spot')],
           names=['s1', 'd1', 's2', 'd2'])

My problem is that isin() returns False when using any as index values :

df_routes.index.isin([('E', 'future', any, any)])

array([False, False, False, False, False, False])

The desired result would be :

array([True, True, True, False, False, False])

There is a similar question here but the answer only works for index not multiindex.

How can i do that ?

Advertisement

Answer

If you wanna filter the dataframe using multi-index, just use .loc

df.loc[('E', 'future')]

Sample DataFrame

                     0
s1 d1     s2 d2
E  future B  future  1
          B5 future  2
          B  spot    3
B  future B  future  4
          B5 future  5
          B  spot    6

Ouput

           0
s2 d2
B  future  1
B5 future  2
B  spot    3

To create a boolean array

(df.index.get_level_values(0) == 'E') & (df.index.get_level_values(1) == 'future')
User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement