大熊猫获得一个群体的平均值

jxn*_*jxn 8 python group-by dataframe pandas

我试图找到每个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
Run Code Online (Sandbox Code Playgroud)

我可以得到每月的总和,但我想要每个user_id的平均月份.

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

id  mth
1   3       30
    4       30
    5       40
2   3       50
    4      130
    5       80
Run Code Online (Sandbox Code Playgroud)

我想要这样的东西:

id average_monthly
1 (30+30+40)/3
2 (50+130+80)/3
Run Code Online (Sandbox Code Playgroud)

Jer*_*ino 10

重置索引应该有效.试试这个:

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

此时重置索引将为您提供独特的月份.

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
Run Code Online (Sandbox Code Playgroud)

这只是再次分组的问题,这次使用mean而不是sum.这应该给你平均值.

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

  • 不需要`reset_index`.`df.groupby(['id','mth']).sum().groupby(level = 0).mean()`将产生相同的结果. (3认同)
  • 我们如何将其作为新列分配回原始数据帧?[transform 技巧](/sf/answers/2117148561/) 无法应付 double group by (2认同)