熊猫数据框每一行的加权平均值
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)?