如何在Python中对groupby聚合进行求和

时间:2018-02-07 20:17:08

标签: python pandas dataframe pandas-groupby

我通过对指定的列应用总和来创建groupby对象,如下所示:

ID    year  £
27    13    445224.269000
      14    485303.817500
31    13     22496.427548
32    14     60154.098500
36    13     78735.072000
      16     39280.150000
37    16      4975.609756
40    13     42309.500000
      14     42309.500000
      15     47163.157000

staff_sum=staff_cost.groupby(['ID', 'year']).sum()

我想将第三个£列的值与下面一个类似的group by组合在一起,它们不具有所有相同的索引。

ID    year   £
27    13     64887.964700
      14    148340.107500
      15     63046.854000
37    16      1221.025000
40    15     42874.086000
      16     57942.192853
      17     66282.030750
41    15     11531.114833
      16     25654.012948
42    14     33224.275500
      15     18565.963000
47    15     10099.868220
46    14     66055.931500
      15       455.000000

material_sum=material_cost.groupby(['ID', 'year']).sum()

所以我想每年将两个£值加在一起和ID,如果另一个groupby对象中缺少一个indice或另一个indice,我们保留那里的值,即ID 46和32保留,即使它们'不在两个数据集中。

我还希望能够将其应用于两组以上的数据。

1 个答案:

答案 0 :(得分:2)

选项1:

In [80]: d1.join(d2, rsuffix='1', how='outer').fillna(0).sum(axis=1).reset_index(name='GBP')
Out[80]:
      ID  year            GBP
0   27.0    13  510112.233700
1   27.0    14  633643.925000
2   27.0    15   63046.854000
3   31.0    13   22496.427548
4   32.0    14   60154.098500
5   36.0    13   78735.072000
6   36.0    16   39280.150000
7   37.0    16    6196.634756
8   40.0    13   42309.500000
9   40.0    14   42309.500000
10  40.0    15   90037.243000
11  40.0    16   57942.192853
12  40.0    17   66282.030750
13  41.0    15   11531.114833
14  41.0    16   25654.012948
15  42.0    14   33224.275500
16  42.0    15   18565.963000
17  46.0    14   66055.931500
18  46.0    15     455.000000
19  47.0    15   10099.868220

选项2:(可能适用于多个DF):

In [125]: d3 = d1 / 10

In [126]: d3
Out[126]:
                      £
ID   year
27.0 13    44522.426900
     14    48530.381750
31.0 13     2249.642755
32.0 14     6015.409850
36.0 13     7873.507200
     16     3928.015000
37.0 16      497.560976
40.0 13     4230.950000
     14     4230.950000
     15     4716.315700

In [127]: pd.concat([d1, d2, d3]).sum(level=['ID','year'])
Out[127]:
                       £
ID   year
27.0 13    554634.660600
     14    682174.306750
31.0 13     24746.070303
32.0 14     66169.508350
36.0 13     86608.579200
     16     43208.165000
37.0 16      6694.195732
40.0 13     46540.450000
     14     46540.450000
     15     94753.558700
27.0 15     63046.854000
40.0 16     57942.192853
     17     66282.030750
41.0 15     11531.114833
     16     25654.012948
42.0 14     33224.275500
     15     18565.963000
47.0 15     10099.868220
46.0 14     66055.931500
     15       455.000000