我想计算每一列中每一组的平均分数。
我将写一个例子来阐明我的目标。假设我有如下的pandas数据框架:<表类>组 #项目得分 tbody><<tr>10 2 15 4 20 6 B5 5 B10 8 表类>
让我们这样做:
f = lambda x: sum(x['#items'] * x['score']) / sum(x['#items'])
df.groupby('Group').apply(f)
将数据帧按Group
列分组,然后以nump.average
传递score
列值为平均值,# items
为权重,应用函数计算加权平均值。您可以通过传递新的列名来调用to_frame
,以从结果序列中创建一个数据帧。
(
df.groupby('Group')
.apply(lambda x: np.average(x['score'], weights=x['# items']))
.to_frame('avg_weighted_score')
)
avg_weighted_score
Group
A 4.444444
B 7.000000
我觉得如果在分组和聚合之前(只是一个假设)预先计算加权列的乘积的和,您将获得更好的性能:
(df.set_index('Group')
.assign(numerator = lambda df: df.prod(1))
.groupby('Group')
.pipe(lambda group: group.numerator.sum() / group['#items'].sum())
)
Group
A 4.444444
B 7.000000
dtype: float64
另一个解决方案,来自@Mozway:
groups = (df.assign(w=df['#items']
.mul(df['score']))
.groupby(df['Group'])
)
groups['w'].sum().div(groups['#items'].sum())
Group
A 4.444444
B 7.000000
dtype: float64
尝试:
x = (
df.groupby("Group")
.apply(lambda x: np.average(x["score"], weights=x["#items"]))
.reset_index()
.rename(columns={0: "avg_weighted_score"})
)
print(x)
打印:
Group avg_weighted_score
0 A 4.444444
1 B 7.000000