如何解决在不使用groupby的情况下计算加权平均值
我正在根据以下数据计算加权平均值。我收到位置索引器超出范围错误。
dfpa:
PA pa_pop pa_mean_ea_kwh
A 30 42431.52608
B 1596 177765.6662
C 193 284501.2339
D 0
E 84 316868.3264
这是我的代码:
wmea = lambda x: np.ma.average(x,weights=(dfpa.loc[x.index,'pa_mean_ea_kwh'] * dfpa.loc[x.index,'pa_pop']))
dfsw = dfpa.agg(
sw_pop = ('pa_pop','sum'),sw_mean_ea_kwh = ('pa_mean_ea_kwh',wmea))
过去,我已经成功使用了类似的代码,但是我的聚合与groupby结合在一起。这样吧
dfsw = dfpa.groupby('PA').agg(
sw_pop = ('pa_pop',wmea))
但是在这种情况下,我只需要单个输出即可获取所有数据。 np.ma.average lambda函数不正确吗?为什么不做一个求和乘积然后除以和呢?
添加所需的输出:
sw_pop sw_mean_ea_kwh
1903 192597.2814
其中sw_mean_ea_kwh计算为SUMPRODUCT(pa_pop,pa_mean_ea_kwh)/ SUM(pa_pop)
ps:还有另一种解决方案here用于计算加权平均值,但它再次使用groupby
解决方法
这与sumproduct相似,但除以sum方法:
(dfpa['pa_pop']*dfpa['pa_mean_ea_kwh']).sum()/(dfpa['pa_pop'].sum())
,
这就是我最终所做的。我并不为此感到骄傲-它并不优雅,而且我无法按原本的期望计算聚合函数中的加权平均值。但这可以与@jlb_gouveia提供的解决方案一起使用:
dfsw = dfpa.agg({'pa_pop':sum},axis = 0)
#convert list to dataframe because the above creates a list
dfsw = dfsw.to_frame()
#transpose so that index becomes column headers
dfsw = dfsw.transpose()
#renames column headers to new names
dfsw.columns = dfsw.columns.str.replace('pa','sw')
#add weighted means
dfsw['sw_mean_ea_kwh'] = (dfpa['pa_pop']*dfpa['pa_mean_ea_kwh']).sum()/(dfpa['pa_pop'].sum())
这是我最终的输出结果:
sw_pop sw_n sw_ncmplt...sw_mean_ea_kwh... sw_mean_ep_kwh
0 1903.0 140.0 140.0 ....192597.28147843637 206253.99375475512
(在上面的代码中,我做了很多求和运算和加权平均,为简化起见,我删除了其他列的代码)
如果某人有更优雅的方法来实现这一目标,则可以改善。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。