Select only one index of multiindex DataFrame Select only one index of multiindex DataFrame python python

Select only one index of multiindex DataFrame


One way could be to simply rebind df.index to the desired level of the MultiIndex. You can do this by specifying the label name you want to keep:

df.index = df.index.get_level_values('first')

or use the level's integer value:

df.index = df.index.get_level_values(0)

All other levels of the MultiIndex would disappear here.


The solution is fairly new and uses the df.xs function as

In [88]: df.xs('bar', level='first')Out[88]:Second  Thirdone     A       -2.315312        B        0.497769        C        0.108523two     A       -0.778303        B       -1.555389        C       -2.625022dtype: float64

Can also do with multiple indices as

In [89]: df.xs(('bar', 'A'), level=('First', 'Third'))Out[89]:Secondone   -2.315312two   -0.778303dtype: float64

The setup for the examples is below

import pandas as pdimport numpy as nparrays = [    np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),    np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]index = pd.MultiIndex.from_tuples(list(zip(*arrays)), names=['first', 'second'])df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)df.index.names = pd.core.indexes.frozen.FrozenList(['First', 'Second', 'Third'])df = df.unstack()


I used the get_level_values(0) to get the first level index in a multi index group by to build a dataframe containing the aggregate value and the description dictionary value of the encoded value. I get the index for "airline_enc" values in the group by

def getAirlineByGrouped(grouped,dictGeneric):    mylist=[]    for key in grouped.index.get_level_values(0):        item=dictGeneric.get(key)        mylist.append(item)    return mylistencoder=LabelEncoder()df['airline_enc']=encoder.fit_transform(df['airline'])dictAirline=   df[['airline_enc','airline']].set_index('airline_enc').to_dict()grouped=results.groupby(['airline_enc','rating'])['recommended'].count()#print(grouped)airlines=getAirlineByGrouped(grouped, dictAirline['airline'])result_df=pd.DataFrame({'index': grouped.index.get_level_values(0),'value':grouped.values,'airline':airlines})result_df.plot(x='airline',y='value')plt.xticks(rotation=90)