【问题标题】:pandas get average of a groupby大熊猫得到一个 groupby 的平均值
【发布时间】:2016-10-16 04:29:39
【问题描述】:

我正在尝试查找每个 user_id 的平均每月费用,但我只能获得每位用户的平均费用或每位用户的每月费用。

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

这是我的 df:

     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

我可以获得每月总和,但我想要每个 user_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

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    重置索引应该可以工作。试试这个:

    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。这应该会给你平均值。

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

    【讨论】:

    • 不需要reset_indexdf.groupby(['id', 'mth']).sum().groupby(level=0).mean() 将产生相同的结果。
    • 我们如何将它分配回原始数据框作为新列? transform trick不能应付双组by
    • 要获取转换,您可以先将id 设置为索引,然后运行groupby 操作:df = df.set_index('id'); df['avg'] = df.groupby(['id','mth']).sum().groupby(level=0).mean()
    【解决方案2】:
    df_monthly_average = (
        df.groupby(["InvoiceMonth", "InvoiceYear"])["Revenue"]
        .sum()
        .reset_index()
        .groupby("Revenue")
        .mean()
        .reset_index()
    )
    

    【讨论】:

    • 您好,感谢您的回答。它对您很有用,但如果您能解释一下您做了什么以及您是如何解决最初的问题的,那将对我们有所帮助!
    猜你喜欢
    • 2023-02-17
    • 2019-07-27
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    相关资源
    最近更新 更多