Sumar columnas por nivel en un DataFrame Multi-Index

Tengo mi df con columnas multi-index. Todos mis valores están en flotación, y quiero fusionar valores en el primer nivel de múltiples índices. Por favor, ver más abajo para más detalles.

first bar baz foo second one two one two one A 0.895717 0.805244 1.206412 2.565646 1.431256 B 0.410835 0.813850 0.132003 0.827317 0.076467 C 1.413681 1.607920 1.024180 0.569605 0.875906 first bar baz foo A (0.895717+0.805244) (1.206412+2.565646) 1.431256 B (0.410835+0.813850) (0.132003+0.827317) 0.076467 C (1.413681+1.607920) (1.024180+0.569605) 0.875906 

Los valores realmente se agregan (simplemente no tenía ganas de hacer todo esto :)). La conclusión es que solo quiero subir de nivel (nivel superior, supongo) y dentro del índice, agregar todos los valores. Por favor, hágamelo saber una buena manera de hacer esto. ¡Gracias!

Creo que estás buscando un groupby largo del primer eje.

 df.groupby(level=0, axis=1).sum() 

O (más sucintamente),

 df.sum(level=0, axis=1) 

El argumento de level a sum implica agrupar.


 df first bar baz foo second one two one two one two A 2 3 3 4 10 8 B 22 16 7 3 2 26 C 4 5 1 9 6 5 df.sum(level=0, axis=1) first bar baz foo A 5 7 18 B 38 10 28 C 9 10 11 

En cuanto al rendimiento, casi no hay diferencia entre los dos métodos descritos anteriormente (este último es unos tics más rápido).

Tenga en cuenta que df.sum(level, axis) solo funcionará si configura sus columnas en el índice múltiple. Ejemplo,

 D = {'one': range(6), 'two': range(1,7), 'CAT1': 'AAAAA A'.split(), 'CAT2': 'BBBCC C'.split(), 'CAT3': 'DDEEF F'.split()} df = pd.DataFrame(D) df = df.set_index('CAT1 CAT2 CAT3'.split()) df one two CAT1 CAT2 CAT3 ABD 0 1 D 1 2 E 2 3 CE 3 4 F 4 5 F 5 6 

Si sus datos están en esta forma, tendrá que usar df.groupby(level=n).sum(axis=1)

 df.groupby(level = 0).sum(axis=1) one two CAT1 A 15 21 df.groupby(level = 1).sum(axis=1) one two CAT2 B 3 6 C 12 15 df.groupby(level = 2).sum(axis=1) one two CAT3 D 1 3 E 5 7 F 9 11 

Si intentas groupby el groupby ,

 df.sum(level = 1, axis=1) ValueError: level > 0 or level < -1 only valid with MultiIndex 

Que es un error interesante ya que,

 df.index MultiIndex(levels=[[u'A'], [u'B', u'C'], [u'D', u'E', u'F']], labels=[[0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1], [0, 0, 1, 1, 2, 2]], names=[u'CAT1', u'CAT2', u'CAT3'])