I have a dedicated function for this. It less elegant, but more flexible. The advantages:
- automatically handles
Index
and MultiIndex
- can assign name
- can add multiple level at once
- choose location (top or bottom)
Best regards.
def addLevel(index, value='', name=None, n=1, onTop=False):
"""Add extra dummy levels to index"""
assert isinstance(index, (pd.MultiIndex, pd.Index))
xar = np.array(index.tolist()).transpose()
names = index.names if isinstance(index, pd.MultiIndex) else [index.name]
addValues = np.full(shape=(n, xar.shape[-1]), fill_value=value)
addName = [name] * n
if onTop:
names = addName + names
xar = np.vstack([addValues, xar])
else:
names = names + addName
xar = np.vstack([xar, addValues])
return pd.MultiIndex.from_arrays(xar, names=names)
df = pd.DataFrame(index=list('abc'), data={'A': range(3), 'B': range(3)})
df.columns = addLevel(df.columns, value='C')
df.columns = addLevel(df.columns, value='D', name='D-name')
df.columns = addLevel(df.columns, value='E2', n=2)
df.columns = addLevel(df.columns, value='Top', name='OnTop', onTop=True)
df.columns = addLevel(df.columns, value=1, name='Number')
print(df)
## OnTop Top
## A B
## C C
## D-name D D
## E2 E2
## E2 E2
## Number 1 1
## a 0 0
## b 1 1
## c 2 2