Pandas滚动窗口内元素比较运算实现求助
解决方案
直接使用pd.rolling().apply()配合自定义函数即可实现需求,核心是在函数中完成窗口内的元素比较与求和逻辑,注意开启raw=True以提升处理效率。
完整代码
import pandas as pd df = pd.DataFrame([ [2, 3, 5, 7,], [8, 3, 6, 1], [1, 5, 9, 13], [7, 3, 2, 7], [12, 4, 1, 0] ]) def rolling_compare_sum(window): # 窗口长度不足4时返回NaN if len(window) < 4: return float('nan') last_val = window[-1] # 按规则生成比较结果并求和 return sum([-1 if last_val > x else 1 for x in window[:-1]]) # 对每列应用长度为4的滚动窗口计算 result = df.rolling(window=4, raw=True).apply(rolling_compare_sum) # 若需要整数格式(保留NaN),可转换为可空整数类型 # result = result.astype('Int64') print(result)
输出结果
0 1 2 3 0 NaN NaN NaN NaN 1 NaN NaN NaN NaN 2 NaN NaN NaN NaN 3 -1.0 3.0 3.0 1.0 4 -3.0 -1.0 3.0 3.0
逻辑说明
- 自定义函数
rolling_compare_sum:- 先判断窗口长度,不足4直接返回
NaN - 提取窗口最后一个元素作为比较基准
- 遍历窗口前3个元素,按规则生成
-1或1,最后求和返回
- 先判断窗口长度,不足4直接返回
- 滚动窗口应用:
window=4指定滚动窗口长度raw=True让Pandas直接传入NumPy数组而非Series,避免索引干扰并提升速度
内容的提问来源于stack exchange,提问作者Aenaon
相关产品推荐
相关产品推荐

