Prepend a level to a pandas MultiIndex
I have a DataFrame with a MultiIndex created after some grouping:
import numpy as np
import pandas as pd
from numpy.random import randn
df = pd.DataFrame({'A' : ['a1', 'a1', 'a2', 'a3'],
'B' : ['b1', 'b2', 'b3', 'b4'],
'Vals' : randn(4)}
).groupby(['A', 'B']).sum()
# Vals
# A B
# a1 b1 -1.632460
# b2 0.596027
# a2 b3 -0.619130
# a3 b4 -0.002009
How do I prepend a level to the MultiIndex so that I turn it into something like:
# Vals
# FirstLevel A B
# Foo a1 b1 -1.632460
# b2 0.596027
# a2 b3 -0.619130
# a3 b4 -0.002009
Solution 1:
A nice way to do this in one line using pandas.concat()
:
import pandas as pd
pd.concat([df], keys=['Foo'], names=['Firstlevel'])
An even shorter way:
pd.concat({'Foo': df}, names=['Firstlevel'])
This can be generalized to many data frames, see the docs.
Solution 2:
You can first add it as a normal column and then append it to the current index, so:
df['Firstlevel'] = 'Foo'
df.set_index('Firstlevel', append=True, inplace=True)
And change the order if needed with:
df.reorder_levels(['Firstlevel', 'A', 'B'])
Which results in:
Vals
Firstlevel A B
Foo a1 b1 0.871563
b2 0.494001
a2 b3 -0.167811
a3 b4 -1.353409