我有这样的df:
idx total
1 5
1 10
1 2
2 10
2 10
2 55
并希望创建另一列,将每个id的总和求和,以得出平均值:
idx total sum avg
1 5 17 5.66
1 10 17 5.66
1 2 17 5.66
2 10 75 25
2 10 75 25
2 55 75 25
答案 0 :(得分:2)
通常我们应该使用transform
,但是由于transform
无法接受带有groupby
对象的函数之类的列表,因此我们使用agg
+ reindex
df.groupby('idx').total.agg(['sum','mean']).reindex(df.idx).reset_index()
Out[64]:
idx sum mean
0 1 17 5.666667
1 1 17 5.666667
2 1 17 5.666667
3 2 75 25.000000
4 2 75 25.000000
5 2 75 25.000000
#df.groupby('idx').total.agg(['sum','mean']).reindex(df.idx).reset_index().assign(Todat=df.total.values)
答案 1 :(得分:1)
您可以将groupby
和agg
一起使用merge
:
df.merge(df.groupby('idx')['total']
.agg(['sum','mean']),
left_on='idx',
right_index=True)
输出:
idx total sum mean
0 1 5 17 5.666667
1 1 10 17 5.666667
2 1 2 17 5.666667
3 2 10 75 25.000000
4 2 10 75 25.000000
5 2 55 75 25.000000