我通过对指定的列应用总和来创建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保留,即使它们'不在两个数据集中。
我还希望能够将其应用于两组以上的数据。
答案 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