Skip to main content
 首页 » 编程设计

python之使用多索引列对多列求和

2025年05月04日16daizhj

我有一个从数据透视表创建的数据框,看起来与此类似:

import pandas as pd 
d = {('company1', 'False Negative'): {'April- 2012': 112.0, 'April- 2013': 370.0, 'April- 2014': 499.0, 'August- 2012': 431.0, 'August- 2013': 496.0, 'August- 2014': 221.0}, 
('company1', 'False Positive'): {'April- 2012': 0.0, 'April- 2013': 544.0, 'April- 2014': 50.0, 'August- 2012': 0.0, 'August- 2013': 0.0, 'August- 2014': 426.0}, 
('company1', 'True Positive'): {'April- 2012': 0.0, 'April- 2013': 140.0, 'April- 2014': 24.0, 'August- 2012': 0.0, 'August- 2013': 0.0,'August- 2014': 77.0}, 
('company2', 'False Negative'): {'April- 2012': 112.0, 'April- 2013': 370.0, 'April- 2014': 499.0, 'August- 2012': 431.0, 'August- 2013': 496.0, 'August- 2014': 221.0}, 
('company2', 'False Positive'): {'April- 2012': 0.0, 'April- 2013': 544.0, 'April- 2014': 50.0, 'August- 2012': 0.0, 'August- 2013': 0.0, 'August- 2014': 426.0}, 
('company2', 'True Positive'): {'April- 2012': 0.0, 'April- 2013': 140.0, 'April- 2014': 24.0, 'August- 2012': 0.0, 'August- 2013': 0.0,'August- 2014': 77.0},} 
 
df = pd.DataFrame(d) 
 
                company1    company2 
                FN  FP  TP  FN  FP  TP 
April- 2012     112 0   0   112 0   0 
April- 2013     370 544 140 370 544 140 
April- 2014     499 50  24  499 50  24 
August- 2012    431 0   0   431 0   0 
August- 2013    496 0   0   496 0   0 
August- 2014    221 426 77  221 426 77 

我希望遍历 multiindex 列的上层,为每个公司创建一个总和列:

                company1           company2 
                FN  FP  TP  SUM    FN   FP  TP   SUM 
April- 2012     112 0   0   112    112  0   0    112 
April- 2013     370 544 140 1054   370  544 140  1054 
April- 2014     499 50  24  573    499  50  24   573 
August- 2012    431 0   0   431    431  0   0    431 
August- 2013    496 0   0   496    496  0   0    496 
August- 2014    221 426 77  724    221  426 77   724 

事先不知道公司名称,所以需要循环

请您参考如下方法:

您可以通过指定 level 来计算此总和(您想要沿第一级(level 0)求和,因此折叠第二级):

In [29]: df.sum(axis=1, level=0) 
Out[29]: 
              company1  company2 
April- 2012        112       112 
April- 2013       1054      1054 
April- 2014        573       573 
August- 2012       431       431 
August- 2013       496       496 
August- 2014       724       724 

如果您希望它们添加到原始数据框中,如上面的示例所示,您可以在列中添加一个级别并连接:

sums = df.sum(level=0, axis=1) 
sums.columns = pd.MultiIndex.from_product([sums.columns, ['SUM']]) 
df = pd.concat([df, sums], axis=1)