【问题标题】:Pandas: calculate weighted average by row using a dataframe and a seriesPandas:使用数据框和系列按行计算加权平均值
【发布时间】:2020-02-15 03:47:36
【问题描述】:

我试图做一个加权平均,但我遇到了一个疑问:

问题

我想创建一个名为 answer 的新列,用于计算每行之间的结果以及在本例中命名为 month 的加权值列表。如果我使用df.mean(),我会按月得到一个简单的平均值,这不是我想要的。这个想法是更加重视年底,而不太重视年末的需求。所以这就是为什么我想使用加权平均计算。

excel 中,我会使用下面的公式。我无法将此计算转换为熊猫数据框。

=SUMPRODUCT( demands[@[1]:[12]] ; month )/SUM(month)

我找不到此问题的解决方案,非常感谢有关此主题的帮助。

提前谢谢你。

这里有一个虚拟数据框作为示例:

示例代码

demand = pd.DataFrame({'1': [360, 40, 100, 20, 55],
                       '2': [500, 180, 450, 60, 50],
                       '3': [64, 30, 60, 10, 0],
                       '4': [50, 40, 30, 60, 50],
                       '5': [40, 24, 45, 34, 60],
                       '6': [30, 34, 65, 80, 78],
                       '7': [56, 45, 34, 90, 58],
                       '8': [32, 12, 45, 55, 66],
                       '9': [32, 56, 89, 67, 56],
                       '10': [57, 35, 75, 48, 9],
                       '11': [56, 33, 11, 6, 78],
                       '12': [23, 65, 34, 8, 67]
                      })

months = [i for i in range(1,13)]

问题的可视化

【问题讨论】:

    标签: python python-3.x pandas numpy


    【解决方案1】:

    只需使用numpy.average,指定weights

    demand["result"]=np.average(demand, weights=months, axis=1)
    

    https://docs.scipy.org/doc/numpy-1.15.1/reference/generated/numpy.average.html

    输出:

         1    2   3   4   5   6  ...   8   9  10  11  12     result
    0  360  500  64  50  40  30  ...  32  32  57  56  23  58.076923
    1   40  180  30  40  24  34  ...  12  56  35  33  65  43.358974
    2  100  450  60  30  45  65  ...  45  89  75  11  34  58.884615
    3   20   60  10  60  34  80  ...  55  67  48   6   8  43.269231
    4   55   50   0  50  60  78  ...  66  56   9  78  67  55.294872
    

    【讨论】:

      【解决方案2】:

      这可以通过以下方式完成:

      demand['result'] = (demand * months).sum(axis=1)/sum(months)
      

      【讨论】:

        【解决方案3】:

        你可以试试这个代码:

        den = np.sum(a)
        demand['average']=demand['1'].mul(1/den).add(demand['2'].mul(2/den)).add(demand['3'].mul(3/den)).add(demand['4'].mul(4/den)).add(demand['5'].mul(5/den)).add(demand['6'].mul(6/den)).add(demand['7'].mul(7/den)).add(demand['8'].mul(8/den)).add(demand['9'].mul(9/den)).add(demand['10'].mul(10/den)).add(demand['11'].mul(11/den)).add(demand['12'].mul(12/den))
        

        输出:

            1   2   3   4   5   6   7   8   9   10  11  12  average
        0   360 500 64  50  40  30  56  32  32  57  56  23  58.076923
        1   40  180 30  40  24  34  45  12  56  35  33  65  43.358974
        2   100 450 60  30  45  65  34  45  89  75  11  34  58.884615
        3   20  60  10  60  34  80  90  55  67  48  6   8   43.269231
        4   55  50  0   50  60  78  58  66  56  9   78  67  55.294872
        

        【讨论】:

          猜你喜欢
          • 2016-02-12
          • 1970-01-01
          • 2014-11-30
          • 2021-03-31
          • 2019-08-29
          • 2019-12-30
          • 1970-01-01
          相关资源
          最近更新 更多