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