【问题标题】:How to compute weighted average如何计算加权平均值
【发布时间】:2020-02-07 22:31:47
【问题描述】:
Country  life_expectancy   population 

Germany     70               3000000
France      75               450000
USA         70               350000
India       65               4000000
Pakistan    60               560000
Belgium     68               230000

我想根据以下公式计算加权平均预期寿命:

∑ (???????????????????? × ????????????????)/ ∑ ????????????????  

where ???????????????????? = life expectancy
      ???????????????? = population

注意:加权平均预期寿命的计算方法是预期寿命乘积之和除以每个国家的总人口除以每个国家的总人口之和

谁能告诉我如何使用for循环解决这个问题?

【问题讨论】:

标签: python pandas


【解决方案1】:

使用numpy.average(..., weights=...)

参考:https://docs.scipy.org/doc/numpy/reference/generated/numpy.average.html

import numpy as np

res=np.average(df["life_expectancy"], weights=df["population"])

输出:

67.22817229336438

【讨论】:

    【解决方案2】:

    带有for循环

    numerator, denominator = 0, 0
    for i in df.index:
        numerator += df.loc[i, 'life_expectancy'] * df.loc[i, 'population']
        denominator += df.loc[i, 'population']
    weighted_average = numerator / denominator
    

    或使用 pandas 以任何更易于阅读的方式更快地完成所有工作(这是我推荐的解决方案)

    weighted_average = (df['life_expectancy']*df['population']).sum() / df['population'].sum()
    

    【讨论】:

    • 感谢您的解决方案。如果我添加另一列大洲,我还有一个问题,那么我如何在大洲上对其进行分组并计算加权平均值?
    • 我试过这样做 df​​.groupby('continents').apply(lambda x : (df['life_expectancy']*df['population']).sum() / df['population '].sum()) 但它给了我所有大陆的相同价值
    • 你的 lambda 函数错了,应该是 df.groupby('continents').apply(lambda x : (x['life_expectancy']*x['population']).sum() /x['人口'].sum())
    • @peeps,你应该接受最好的答案,一旦你看到它
    【解决方案3】:

    这里其实不需要for循环你可以直接计算

    life_exp = (countries_df.life_expectancy*countries_df.population).sum()/countries_df.population.sum()
    

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 2021-11-24
      • 2017-01-06
      • 2016-05-10
      • 2015-04-02
      • 2012-06-14
      • 2016-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多