熊猫数据框每一行的加权平均值

Posted

技术标签:

【中文标题】熊猫数据框每一行的加权平均值【英文标题】:Weighted average for each row of a pandas dataframe 【发布时间】:2021-03-10 11:20:48 【问题描述】:

我们有一个这样定义的数据框 df:

t = pd.DataFrame(

    "id": ["id1", "id2", "id3", "id4"],
    "A": [1, 4, 6, 12],
    "B": [5, 8, 3, 6],
    "C": [9, 14, 7, 10],

)

然后我有一个列表:

weight = [2, .5, 1]

我需要创建一个新列“WMean”,为每一行提供加权平均值,其中 A 列的权重为 2,B 列的权重为 0.5,C 列的权重为 1。权重不必是列表.它可以有其他类型。

我需要最快的方式来做到这一点。

结果是:

id  |  A | B |  C | WMean
id1 |  1 | 5 |  9 |  3.857142857142857
id2 |  4 | 8 | 14 |  7.428571428571429
id3 |  6 | 3 |  7 |  5.857142857142857
id4 | 12 | 6 | 10 | 10.571428571428571

谢谢。

【问题讨论】:

【参考方案1】:

numpy.average 与按列表过滤的列一起使用:

weight = [2, .5, 1]
cols = ['A','B','C']

t['WMean'] = np.average(t[cols], weights=weight, axis=1)
print (t)
    id   A  B   C      WMean
0  id1   1  5   9   3.857143
1  id2   4  8  14   7.428571
2  id3   6  3   7   5.857143
3  id4  12  6  10  10.571429

【讨论】:

@Ch3steR - 我尝试测试,但我认为它更慢。 In [228]: %timeit t['WMean1'] = np.average(t[cols], weights=weight, axis=1) 1.88 ms ± 191 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) In [229]: %timeit t['WMean2'] = t[cols].agg(np.average, axis=1, weights=weight) 1.79 s ± 18.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) @Ch3steR - 测试了 40k 行 t = pd.concat([t] * 10000, ignore_index=True) @Ch3steR - 是的,我认为原因是agg 逐行迭代,太慢了。 是的,我猜它在每一行都应用np.average

以上是关于熊猫数据框每一行的加权平均值的主要内容,如果未能解决你的问题,请参考以下文章

熊猫滚动加权平均值

基于买卖的加权平均收购成本熊猫

如何使用带有询价和出价的熊猫数据框计算体积加权平均价格(VWAP)?

group的加权平均值不等于pandas groupby中的总平均值

多列的加权平均值

在 s-s-rS 2008 R2 中计算 Tablix 中的加权平均值