不使用 groupby 计算加权平均值
Calculate weighted average without using 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', '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)/SUM(pa_pop)
ps:有一个替代解决方案 here 来计算加权平均值,但它再次使用 groupby
这类似于求和和除以求和方法:
(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
(我在上面的代码中做了很多求和和加权均值,为了简单起见,我删除了额外列的代码)
如果有人有更优雅的实现方式希望改进。
我正在计算以下数据的加权平均值。我收到 位置索引器超出范围 错误。
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)/SUM(pa_pop)
ps:有一个替代解决方案 here 来计算加权平均值,但它再次使用 groupby
这类似于求和和除以求和方法:
(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
(我在上面的代码中做了很多求和和加权均值,为了简单起见,我删除了额外列的代码)
如果有人有更优雅的实现方式希望改进。