如何使用多个Pandas Series实现加权和计算?
正确实现元素级加权和平均的简洁方式
嘿,我得先指出来:你当前的代码其实和你描述的需求完全不匹配哦!你想要的是对每个元素先计算(r * y) / p,然后把所有结果加起来再除以元素数量n;但你现在写的是先把r、y分别求和相乘,再除以p的总和,最后再除以n——这两种计算逻辑天差地别。
正确的简洁实现
Pandas Series本身就支持元素级运算,加上内置的mean()方法,一行代码就能搞定你的需求:
result = (r * y / p).mean()
为什么这能满足需求?
r * y:对两个Series做元素级乘法,得到每个位置上r和y的乘积;/ p:把上面的结果和p做元素级除法,得到每个位置的(r*y)/p;.mean():直接计算所有元素的平均值,等价于sum(...) / len(...),正好对应你要的(1/n) * sum((r*y)/p)。
对比你当前的错误实现
举个简单例子,用你给出的r = [1,0,0,1,0]和y = [1,0,0,0,1]:
- 元素级
r*y的结果是[1,0,0,0,0],之后除以p的每个元素,再求平均,这才是你要的结果; - 而你当前的代码
(1/len(r))*((r.sum() * y.sum()) / p.sum()),计算的是(1/5)*((2)*(2)/sum(p)),这完全不是同一个逻辑。
如果担心p中出现0导致除法错误,可以提前处理(比如用p.replace(0, np.nan)后调用.mean(skipna=True)),不过你这里用np.random.random(5)生成的p都是0到1之间的正数,所以没问题。
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

