Anteponer un nivel a un pandas MultiIndex

Tengo un DataFrame con un MultiIndex creado después de algunos grupos:

import numpy as np import pandas as p from numpy.random import randn df = p.DataFrame({ 'A' : ['a1', 'a1', 'a2', 'a3'] , 'B' : ['b1', 'b2', 'b3', 'b4'] , 'Vals' : randn(4) }).groupby(['A', 'B']).sum() df Output> Vals Output> AB Output> a1 b1 -1.632460 Output> b2 0.596027 Output> a2 b3 -0.619130 Output> a3 b4 -0.002009 

¿Cómo antepongo un nivel al MultiIndex para que lo convierta en algo como:

 Output> Vals Output> FirstLevel AB Output> Foo a1 b1 -1.632460 Output> b2 0.596027 Output> a2 b3 -0.619130 Output> a3 b4 -0.002009 

Una buena manera de hacer esto en una línea usando pandas.concat() :

 import pandas as pd pd.concat([df], keys=['Foo'], names=['Firstlevel']) 

Esto se puede generalizar a muchos marcos de datos, consulte la documentación .

Primero puede agregarlo como una columna normal y luego agregarlo al índice actual, por lo que:

 df['Firstlevel'] = 'Foo' df.set_index('Firstlevel', append=True, inplace=True) 

Y cambia el orden si es necesario con:

 df.reorder_levels(['Firstlevel', 'A', 'B']) 

Lo que resulta en:

  Vals Firstlevel AB Foo a1 b1 0.871563 b2 0.494001 a2 b3 -0.167811 a3 b4 -1.353409