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)