Pandas如何对groupby后的数据进行平均值计算?

18

我想要找出每个用户的平均每月费用,但我现在只能得到每个用户的平均费用或每个用户的月度费用。

因为我按照用户和月份分组,所以无法获取第二个分组(月份)的平均值,除非我将分组输出转换为其他形式。

这是我的数据框:

     df = { 'id' : pd.Series([1,1,1,1,2,2,2,2]),
            'cost' : pd.Series([10,20,30,40,50,60,70,80]),
            'mth': pd.Series([3,3,4,5,3,4,4,5])}

   cost  id  mth
0    10   1    3
1    20   1    3
2    30   1    4
3    40   1    5
4    50   2    3
5    60   2    4
6    70   2    4
7    80   2    5

我可以获得每月的总和,但我想要每个用户ID每月的平均值。

df.groupby(['id','mth'])['cost'].sum()

id  mth
1   3       30
    4       30
    5       40
2   3       50
    4      130
    5       80

我希望你能提供类似这样的内容:

id average_monthly
1 (30+30+40)/3
2 (50+130+80)/3
2个回答

22

尝试重置索引,应该可以解决问题。请尝试以下操作:

In [19]: df.groupby(['id', 'mth']).sum().reset_index().groupby('id').mean()  
Out[19]: 
    mth       cost
id                
1   4.0  33.333333
2   4.0  86.666667
你只需要省略 mth 就可以了。逻辑是在 sum 部分之后,你会得到这样的结果:
In [20]: df.groupby(['id', 'mth']).sum()
Out[20]: 
        cost
id mth      
1  3      30
   4      30
   5      40
2  3      50
   4     130
   5      80

在此时重置索引将为您提供唯一的月份。

In [21]: df.groupby(['id', 'mth']).sum().reset_index()
Out[21]: 
   id  mth  cost
0   1    3    30
1   1    4    30
2   1    5    40
3   2    3    50
4   2    4   130
5   2    5    80

只需再次对其进行分组,这次使用 mean 而不是 sum 就可以了。这样应该能给您提供平均值。

如果有帮助,请告诉我们。


5
不需要reset_indexdf.groupby(['id', 'mth']).sum().groupby(level=0).mean()会产生相同的结果。 - Kartik
3
我们怎么将这个结果分配回原始数据框作为新列?变换技巧 无法应对双重分组。 - Mr_and_Mrs_D
要获得变换,您可以首先将“id”设置为索引,然后运行“groupby”操作:df = df.set_index('id'); df['avg'] = df.groupby(['id','mth']).sum().groupby(level=0).mean() - sammywemmy

-1
df_monthly_average = (
    df.groupby(["InvoiceMonth", "InvoiceYear"])["Revenue"]
    .sum()
    .reset_index()
    .groupby("Revenue")
    .mean()
    .reset_index()
)

嗨,感谢回答。很高兴它对你有效,但如果您能解释一下您做了什么以及如何解决最初的问题,那会对我们有所帮助! - Simas Joneliunas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接