Python 熊猫的平均成绩是群比
我试图找到每个用户的平均每月成本,但我只能得到每个用户的平均成本或每个用户的每月成本 因为我是按用户和月份分组的,所以除非我将groupby输出转换为其他输出,否则无法获得第二个groupby(月份)的平均值 这是我的df:Python 熊猫的平均成绩是群比,python,pandas,dataframe,group-by,Python,Pandas,Dataframe,Group By,我试图找到每个用户的平均每月成本,但我只能得到每个用户的平均成本或每个用户的每月成本 因为我是按用户和月份分组的,所以除非我将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(
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
重置索引应该会起作用。试试这个:
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
。逻辑是,在求和
部分之后,您有:
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
。这应该给你平均值
如果这有帮助,请告诉我们。无需
重置索引
df.groupby(['id',mth']).sum().groupby(level=0).mean()
将产生相同的结果。我们如何将其作为新列分配回原始数据帧?无法处理双group BY要获得转换,可以先将id
设置为索引,然后运行groupby
操作:df=df.set_index('id');df['avg']=df.groupby(['id','mth']).sum().groupby(level=0.mean()