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)
              A     
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 second, so that I get
              A    B  
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 df.index.levels[1], but that creates a sorted list, it doesn't preserve the order. 
If it was a single index, I would use df.index 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'] = idx.to_series().str[1]
                        df['B'] = df.index.get_level_values(level=1)  # Zero based indexing.
# df['B'] = df.index.get_level_values(level='second')  # This also works.
>>> df
               A      B
first second           
foo   one     12    one
      two     11    two
bar   one     16    one
      two     12    two
      three   11  three
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With