使用多列聚合并获取Python中的平均值

使用多列聚合并获取Python中的平均值,python,pandas,Python,Pandas,我有这个数据框 df month merchant sales 11 M1 10 11 M1 6 11 M2 7 12 M3 8 12 M4 9 12 M2 6 10 M5 11 我想按月份、商户进行分组,得到每个商户每月的平均销

我有这个数据框

df

month      merchant   sales
11           M1        10   
11           M1        6     
11           M2        7
12           M3        8
12           M4        9
12           M2        6
10           M5        11
我想按
月份、商户
进行分组,得到每个商户每月的平均销售额(四舍五入为2位小数)
sales

例如,如下所示,对于
第11个月
,对于
M1
可以计算为
((10+6)/(10+6+7))
对于
M2
计算为
(7/(10+6+7))
。每个月的平均总和不应大于1。例如,对于
第11个月
,其总和为
0.69+0.30~1

我正在寻找的输出是:

month      merchant   sales    average
11           M1        16        0.69  
11           M2        7         0.30 
12           M3        8         0.30
12           M4        9         0.39
12           M2        6         0.26
10           M5        11        1
我试过了,但没能得到我想要的

df =df.groupby('month')[['merchant', 'sales']].agg(list).reset_index()

在python pandas中,有人能帮上忙吗?

您可以按月分组,汇总销售额,然后将销售额除以总和:

df2 = df.groupby(['month', 'merchant'])['sales'].sum().reset_index()

df2['average'] = df2['sales'] / df2.groupby(['month'])['sales'].transform(sum)

df2
   month merchant  sales   average
0     10       M5     11  1.000000
1     11       M1     16  0.695652
2     11       M2      7  0.304348
3     12       M2      6  0.260870
4     12       M3      8  0.347826
5     12       M4      9  0.391304

您可以按月分组,将销售额相加,然后将销售额除以总和:

df2 = df.groupby(['month', 'merchant'])['sales'].sum().reset_index()

df2['average'] = df2['sales'] / df2.groupby(['month'])['sales'].transform(sum)

df2
   month merchant  sales   average
0     10       M5     11  1.000000
1     11       M1     16  0.695652
2     11       M2      7  0.304348
3     12       M2      6  0.260870
4     12       M3      8  0.347826
5     12       M4      9  0.391304

@mck举个我举的例子,它工作得很好。但我试过你们的代码,在我拥有的大数据集上,它并没有给出我想要的。现在,我更新了问题。是否有可能根据我更新的问题更新您的解决方案?@Hiwot check edited answer?@mck对于我给出的示例,它非常有效。但我试过你们的代码,在我拥有的大数据集上,它并没有给出我想要的。现在,我更新了问题。是否可以根据我更新的问题更新您的解决方案?@Hiwot check编辑的答案?