Python (Pandas) Agregue un subtotal en cada lvl de dataframe multiindex

Suponiendo que tengo el siguiente dataframe:

abc Sce1 Sce2 Sce3 Sce4 Sce5 Sc6 Animal Ground Dog 0.0 0.9 0.5 0.0 0.3 0.4 Animal Ground Cat 0.6 0.5 0.3 0.5 1.0 0.2 Animal Air Eagle 1.0 0.1 0.1 0.6 0.9 0.1 Animal Air Owl 0.3 0.1 0.5 0.3 0.5 0.9 Object Metal Car 0.3 0.3 0.8 0.6 0.5 0.6 Object Metal Bike 0.5 0.1 0.4 0.7 0.4 0.2 Object Wood Chair 0.9 0.6 0.1 0.9 0.2 0.8 Object Wood Table 0.9 0.6 0.6 0.1 0.9 0.7 

Quiero crear un MultiIndex, que contendrá la sum de cada lvl. La salida se verá así:

 abc Sce1 Sce2 Sce3 Sce4 Sce5 Sce6 Animal 1.9 1.6 1.4 1.3 2.7 1.6 Ground 0.6 1.4 0.8 0.5 1.3 0.6 Dog 0.0 0.9 0.5 0.0 0.3 0.4 Cat 0.6 0.5 0.3 0.5 1.0 0.2 Air 1.3 0.2 0.7 0.8 1.4 1.0 Eagle 1.0 0.1 0.1 0.6 0.9 0.1 Owl 0.3 0.1 0.5 0.3 0.5 0.9 Object 2.6 1.6 1.8 2.3 2.0 2.3 Metal 0.8 0.3 1.1 1.3 0.9 0.8 Car 0.3 0.3 0.8 0.6 0.5 0.6 Bike 0.5 0.1 0.4 0.7 0.4 0.2 Wood 1.8 1.3 0.6 1.0 1.1 1.5 Chair 0.9 0.6 0.1 0.9 0.2 0.8 Table 0.9 0.6 0.6 0.1 0.9 0.7 

En este momento estoy usando un bucle para crear tres marcos de datos diferentes en cada nivel y luego manipularlos en Excel, como se muestra a continuación. Así que quise tomar este cálculo en python si es posible.

 for i in range range(0,3): df = df.groupby(list(df.columns)[0:lvl], as_index=False).sum() return df 

Muchas gracias de antemano.

    Con un uso liberal de MAGIC

     pd.concat([ df.assign( **{x: 'Total' for x in 'abc'[i:]} ).groupby(list('abc')).sum() for i in range(4) ]).sort_index() Sce1 Sce2 Sce3 Sce4 Sce5 Sc6 abc Animal Air Eagle 1.0 0.1 0.1 0.6 0.9 0.1 Owl 0.3 0.1 0.5 0.3 0.5 0.9 Total 1.3 0.2 0.6 0.9 1.4 1.0 Ground Cat 0.6 0.5 0.3 0.5 1.0 0.2 Dog 0.0 0.9 0.5 0.0 0.3 0.4 Total 0.6 1.4 0.8 0.5 1.3 0.6 Total Total 1.9 1.6 1.4 1.4 2.7 1.6 Object Metal Bike 0.5 0.1 0.4 0.7 0.4 0.2 Car 0.3 0.3 0.8 0.6 0.5 0.6 Total 0.8 0.4 1.2 1.3 0.9 0.8 Total Total 2.6 1.6 1.9 2.3 2.0 2.3 Wood Chair 0.9 0.6 0.1 0.9 0.2 0.8 Table 0.9 0.6 0.6 0.1 0.9 0.7 Total 1.8 1.2 0.7 1.0 1.1 1.5 Total Total Total 4.5 3.2 3.3 3.7 4.7 3.9 

    Puedo obtener exactamente lo que pediste con

     pd.concat([ df.assign( **{x: '' for x in 'abc'[i:]} ).groupby(list('abc')).sum() for i in range(1, 4) ]).sort_index() Sce1 Sce2 Sce3 Sce4 Sce5 Sc6 abc Animal 1.9 1.6 1.4 1.4 2.7 1.6 Air 1.3 0.2 0.6 0.9 1.4 1.0 Eagle 1.0 0.1 0.1 0.6 0.9 0.1 Owl 0.3 0.1 0.5 0.3 0.5 0.9 Ground 0.6 1.4 0.8 0.5 1.3 0.6 Cat 0.6 0.5 0.3 0.5 1.0 0.2 Dog 0.0 0.9 0.5 0.0 0.3 0.4 Object 2.6 1.6 1.9 2.3 2.0 2.3 Metal 0.8 0.4 1.2 1.3 0.9 0.8 Bike 0.5 0.1 0.4 0.7 0.4 0.2 Car 0.3 0.3 0.8 0.6 0.5 0.6 Wood 1.8 1.2 0.7 1.0 1.1 1.5 Chair 0.9 0.6 0.1 0.9 0.2 0.8 Table 0.9 0.6 0.6 0.1 0.9 0.7 

    En cuanto al cómo! Dejaré eso como un ejercicio para el lector.

    necesita hacer dos group by para obtener subtotales en cada nivel de agregación. Luego, agrégalos nuevamente al DF inicial. Aquí hay una pregunta relacionada .