在pandas的MultiIndex DataFrame中按层级求和列

16

我有一个带有多级列索引的数据框,其中所有值都是浮点数,我想合并多级索引中第一级内的值。请参见下面的详细信息。

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 

这些值实际上是相加的(我只是懒得做这个 :))。最重要的是,我只想升级(我猜应该是更高级别),并且在索引中添加所有这些值。请告诉我一个好方法来做到这一点。谢谢!

2个回答

26

我相信你正在寻找沿着第一轴进行groupby的方法。

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

在旧版本的pandas中,这种方法也可以使用:

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

sum函数的level参数意味着分组。


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

就性能而言,上面两种方法之间几乎没有什么区别(后者稍微快了几个时钟周期)。

1
df.sum(axis=1, level='first') 在 OP 的情况下也可以工作,因为索引级别 0 有一个名称。 - mins
@mins 利用命名索引,这是一个很好的提示。谢谢! - cs95
2
几年后,df.sum(levels=...)已经被弃用,并将在未来版本中删除。df.groupby(levels=...).sum()是正确的方法。 - Antimon
我们如何将单个列的总和分配给新列 - Hamza usman ghani

6

请记住,df.sum(level, axis) 只有在您将列设置为多重索引时才能起作用。例如:

D = {'one': range(6), 
     'two': range(1,7), 
     'CAT1': 'A A A A A A'.split(), 
     'CAT2': 'B B B C C C'.split(), 
     'CAT3': 'D D E E F F'.split()}

df = pd.DataFrame(D)
df = df.set_index('CAT1 CAT2 CAT3'.split())
df
                one  two
CAT1 CAT2 CAT3          
A    B    D       0    1
          D       1    2
          E       2    3
     C    E       3    4
          F       4    5
          F       5    6

如果您的数据是这种形式,您需要使用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

如果您尝试跳过groupby
df.sum(level = 1, axis=1)

ValueError: level > 0 or level < -1 only valid with  MultiIndex

这是一个有趣的错误,因为

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'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接