A User A User - 2 months ago 12
Python Question

Pandas: get multiindex level as series

I have a dataframe with multiple levels, eg:

idx = pd.MultiIndex.from_product((['foo', 'bar'], ['one', 'five', 'three' 'four']),
names=['first', 'second'])
df = pd.DataFrame({'A': [np.nan, 12, np.nan, 11, 16, 12, 11, np.nan]}, index=idx).dropna().astype(int)

first second
foo five 12
four 11
bar one 16
five 12
three 11

I want to create a new column using the index level titled
, so that I get

first second
foo five 12 five
four 11 four
bar one 16 one
five 12 five
three 11 three

I can do this by resetting the index, copying the column, then re-applying, but that seems more round-about.

I tried
, but that creates a sorted list, it doesn't preserve the order.

If it was a single index, I would use
but in a multiindex that creates a column of tuples.

If this is resolved elsewhere, please share as I haven't had any luck searching the stackoverflow archives.

df['B'] = df.index.get_level_values(level=1)  # Zero based indexing.

>>> df
               A      B
first second           
foo   one     12    one
      two     11    two
bar   one     16    one
      two     12    two
      three   11  three