Reputation: 5001
index = [np.array(['foo', 'foo', 'qux']),
np.array(['a', 'b', 'a'])]
data = np.random.randn(3, 2)
columns = ["X", "Y"]
df = pd.DataFrame(data, index=index, columns=columns)
df.index.names = ["Level0", "Level1"]
print df
X Y
Level0 Level1
foo a 0.418549 0.252685
b -1.307099 0.202833
qux a 0.046095 -0.968976
New level
I want to take the index of df and create a new MultiIndex that now has an additional level.
new_level_name = "New level"
new_level_labels = ['p', 'q']
# new_multi-index
Desired MultiIndex
Level0 Level1 Level2
foo a p
q
b p
q
qux a p
q
Upvotes: 7
Views: 9436
Reputation: 3048
Not exactly sure what data should be in your desired DataFrame, but for a similar problem I used melt()
:
df1 = df.reset_index()
pd.melt(df1, id_vars=['Level0', 'Level1'])
Level0 Level1 variable value
0 foo a X 0.678564
1 foo b X -0.609134
2 qux a X 0.505178
3 foo a Y -2.593380
4 foo b Y -0.232796
5 qux a Y -1.420875
Upvotes: 0
Reputation: 862406
The simpliest is use stack
with new DataFrame
with columns by new level values:
df1 = pd.DataFrame(data=1,index=df.index, columns=new_level_labels).stack()
df1.index.names = ['Level0','Level1',new_level_name]
print (df1)
Level0 Level1 New level
foo a p 1
q 1
b p 1
q 1
qux a p 1
q 1
dtype: int64
print (df1.index)
MultiIndex(levels=[['foo', 'qux'], ['a', 'b'], ['p', 'q']],
labels=[[0, 0, 0, 0, 1, 1], [0, 0, 1, 1, 0, 0], [0, 1, 0, 1, 0, 1]],
names=['Level0', 'Level1', 'New level'])
Upvotes: 8