【问题标题】:Calculate weighted average without using groupby在不使用 groupby 的情况下计算加权平均值
【发布时间】:2020-10-28 19:50:43
【问题描述】:

我正在计算以下数据的加权平均值。我收到 positional indexers are out of bounds 错误。

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 函数是否不正确?为什么它不只做一个 sumproduct 然后除以总和?

添加所需的输出:

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

【问题讨论】:

  • 您能否准确说明预期的输出应该是什么样的?你能发布一个输出数据框吗?
  • 我已经添加了所需的输出@DavidErickson

标签: python pandas aggregate weighted-average


【解决方案1】:

这类似于 sumproduct 并除以 sum 方法:

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

【讨论】:

    【解决方案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
    

    (我在上面的代码中做了很多求和和加权平均值,为了简单起见,我删除了附加列的代码)

    如果有人有更优雅的方式来实现这一点,希望改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      • 2019-12-30
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多