熊猫中另一列的加权平均值



我想计算每一列中每一组的平均分数。

我将写一个例子来阐明我的目标。假设我有如下的pandas数据框架:
<表类>组#项目得分tbody><<tr>102154206B55B108

让我们这样做:

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

最新更新