python - pandas 中基于窗口的加权平均值

标签 python pandas

我正在尝试对两列进行基于窗口的加权平均值

例如,如果我有值列“a”和权重列“b”

   a b
1: 1 2
2: 2 3
3: 3 4

尾随窗口为 2(尽管 id 喜欢使用可变窗口长度)

我的第三个加权平均列应该是“c”,其中没有足够的先前数据进行完整加权平均的行是 nan

   c
1: nan
2: (1 * 2 + 2 * 3) / (2 + 3) = 1.8
3: (2 * 3 + 3 * 4) / (3 + 4) = 2.57

最佳答案

对于窗口为 2 的特定情况,您可以使用 prodshift

s = df.prod(1)
(s + s.shift()) / (df.b + df.b.shift())

Out[189]:
1         NaN
2    1.600000
3    2.571429
dtype: float64

在示例df2上:

       a      b
0  73.78  51.46
1  73.79  27.84
2  73.79  34.35

s = df2.prod(1)
(s + s.shift()) / (df2.b + df2.b.shift())

Out[193]:
0          NaN
1    73.783511
2    73.790000
dtype: float64
<小时/>

此方法仍然适用于可变窗口长度。对于可变窗口长度,您需要额外的 listcomp 和 sum

尝试上面的示例 df2

s = df2.prod(1)

m = 2  #window length 2
sum([s.shift(x) for x in range(m)]) / sum([df2.b.shift(x) for x in range(m)])

Out[214]:
0          NaN
1    73.783511
2    73.790000
dtype: float64

窗口长度为 3

m = 3  #window length 3
sum([s.shift(x) for x in range(m)]) / sum([df2.b.shift(x) for x in range(m)])

Out[215]:
0          NaN
1          NaN
2    73.785472
dtype: float64

关于python - pandas 中基于窗口的加权平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59296434/

相关文章:

Python,装饰函数中引用类实例/方法

python - 在 jython 中提供/使用 Web 服务的最简单方法是什么?

python - 使用正则表达式有效地将一列中的部分值替换为 pandas 中另一列中的值?

python-3.x - 从每个单元格中的 pandas 中删除连续的重复条目

Python Pandas - 周期长度不均匀的移动平均线

Python - 使用 strptime() 将 "20:52:30.0000000+02:00"转换为日期时间

python - 为什么 python `__setstate__` 接受 `None` 作为参数?

python - QWidget 类型的包装的 c/c++ 对象已被删除

python - 如何使用 Pandas 选择csv文件中的某些列

python - 增加 pandas GroupBy 中满足条件的计数