不使用groupby计算加权平均数

2024-10-02 20:34:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我根据以下数据计算加权平均值。我得到一个位置索引器超出范围的错误

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', 'sum'),
    sw_mean_ea_kwh = ('pa_mean_ea_kwh', 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)/总和(pa_pop)

ps:有一个替代解决方案here来计算加权平均值,但它再次使用groupby


Tags: 数据lambda代码npswmeanpop平均值
2条回答

这就是我最后做的。我并不以它为荣——它并不优雅,而且我无法像我最初想要的那样计算聚合函数中的加权平均值。但它与@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

(我在上面的代码中做了许多求和和和加权平均,我删除了附加列的代码以保持简单)

如果有人有一个更优雅的方式来实现这一点,我想提高

其工作原理类似于求和积和除以求和法:

(dfpa['pa_pop']*dfpa['pa_mean_ea_kwh']).sum()/(dfpa['pa_pop'].sum())

相关问题 更多 >