Groupby multiindex并获得第一个索引的总和

时间:2019-04-10 14:23:33

标签: python pandas pandas-groupby

我有要分组的数据,并沿多索引求和,但是我也只具有多索引的第一部分的总和。因此,想法是将索引作为多索引,然后我可以看到该索引的大小和仅其第一组的大小。例如,我有一个数据框,例如:

d = {'attr_1': ['A','A','A','B','B'], 'attr_2': ['a','a','b','a','b'],'val': [1,2,3,4,5]}
df = pd.DataFrame(d)
df

    a_1 a_2 val
0   A   a   1
1   A   a   2
2   A   b   3
3   B   a   4
4   B   b   5

我想做的是:

        val sum_a1
a_1 a_2 
A   a   3   6
A   b   3   6
B   a   4   9
B   b   5   9

我正在寻找一种干净的方法。我目前的方法是制作一个新的数据框,将其转换为字典,重置索引,然后映射该字典,但是似乎应该有一种更简单,更Python化的方法来实现此目的。

a = df.groupby(['a_1','a_2']).sum()
b = df.groupby(['a_1']).sum()
my_dict = b.to_dict()['val']
a = a.reset_index()
a['sum_a1'] = a.a_1.map(my_dict)
a
    a_1 a_2 val sum_a1
0   A   a   3   6
1   A   b   3   6
2   B   a   4   9
3   B   b   5   9

任何帮助将不胜感激。很抱歉,如果这是我重复搜索的问题,却找不到相同的内容。

2 个答案:

答案 0 :(得分:2)

您正在寻找transform

a = df.groupby(['attr_1','attr_2']).sum()
a['sum_a1']=a.groupby(level=0)['val'].transform('sum')
a
Out[14]: 
               val  sum_a1
attr_1 attr_2             
A      a         3       6
       b         3       6
B      a         4       9
       b         5       9

答案 1 :(得分:1)

使用set_indexsum使join对齐索引。

df.set_index(['attr_1', 'attr_2']).pipe(
    lambda d: d.sum(level=[0, 1]).join(d.val.rename('sum_a1').sum(level=0))
)

               val  sum_a1
attr_1 attr_2             
A      a         3       6
       b         3       6
B      a         4       9
       b         5       9