Pandas 滚动窗口自定义函数应用:支持列名访问与灵活输出维度的高效实现
发布时间 - 2026-01-30 00:00:00 点击率:次本文介绍如何在 pandas 中对 dataframe 执行滚动窗口计算,突破 `rolling().apply()` 的限制(如无法按列名访问、强制输入输出列数一致),结合 numpy 的 `sliding_window_view` 构建可读性强、性能可控、完全支持 dataframe 语义的操作方案。
在 Pandas 中,DataFrame.rolling(window).apply(func) 是最常用的滚动计算接口,但其存在两个关键局限:一是当启用 raw=True 时,传入函数的是 numpy.ndarra

官方 rolling 接口目前不支持原生的、带列名上下文且输出维度可变的滚动函数应用。method="table" 和 engine="numba" 仅优化底层计算,无法解决语义缺失问题。因此,需借助更底层但可控的工具——NumPy 的 sliding_window_view。
该函数可在不复制内存的前提下,将二维数组切分为一系列滑动窗口视图(shape = (n_windows, window_height, window_width)),再逐窗口构造轻量级临时 DataFrame(通过 copy=False 避免数据冗余),从而在保留列名访问能力的同时,自由定义任意逻辑并返回任意长度的结果元组。
以下是一个生产就绪的完整示例:
import pandas as pd
import numpy as np
from numpy.lib.stride_tricks import sliding_window_view
# 原始数据
df = pd.DataFrame({
"A": range(10),
"B": range(10, 20),
"C": range(20, 30)
})
cols = ["A", "B", "C"]
# 初始化结果列表(首行为 NaN 占位,对应窗口未满)
results = [tuple([np.nan] * 4)] # 假设输出 4 列:D, E, F, G
# 滑动窗口遍历(窗口大小为 2 行 × 3 列)
for window_arr in sliding_window_view(df.values, window_shape=(2, 3)):
# 构造无拷贝临时 DataFrame,复用原始列名
window_df = pd.DataFrame(window_arr[0], columns=cols, copy=False)
# ✅ 自由使用列名进行复杂计算(支持向量化、agg、自定义逻辑)
D_val = window_df["A"].sum() # 例:A列和
E_val = (window_df["A"] + window_df["B"]).mean() # 例:A+B均值
F_val = (window_df["C"] - 1).prod() # 例:C-1连乘
G_val = (window_df["B"] * 2).sum() # 例:B×2之和
results.append((D_val, E_val, F_val, G_val))
# 合并结果到原 DataFrame
result_df = pd.DataFrame(results, columns=["D", "E", "F", "G"])
df_final = pd.concat([df, result_df], axis=1)
print(df_final)⚠️ 注意事项: sliding_window_view 要求 NumPy ≥ 1.20;若版本较低,可用 np.lib.stride_tricks.as_strided 手动实现,但需谨慎处理内存安全。 copy=False 仅保证 DataFrame 构造时不复制底层数据,但后续若对 window_df 进行 inplace=True 修改,可能影响原始数据——实践中应将其视为只读视图。 窗口大小 (2, 3) 表示取连续 2 行、全部 3 列;若只需沿行方向滚动(忽略列维度),可简化为 sliding_window_view(df.values, window_shape=(2,)) 并 reshape 处理。 对于超大规模数据(千万级+),可考虑分块处理或改用 Dask/Polars;但对百万行以内,此方法性能通常优于纯 Python 循环,且远胜 rolling(...).apply(..., raw=False)(后者会为每个窗口创建完整 DataFrame 副本,开销极大)。
总结而言,当标准 rolling.apply 无法满足列语义与输出灵活性需求时,sliding_window_view + 临时 DataFrame 是一种简洁、高效、可维护的替代范式。它既规避了显式索引与嵌套循环的代码噪音,又保留了 Pandas 最擅长的列导向表达能力,是中高级数据分析流程中的实用利器。
# python
# windows
# app
# 工具
# win
# numpy
# pandas
# 循环
# 接口
# copy
# table
# 数据分析
# 的是
# 是一个
# 原始数据
# 是一种
# 切分
# 一是
# 遍历
# 只需
# 而在
# 将其
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
如何在局域网内绑定自建网站域名?
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
如何在Tomcat中配置并部署网站项目?
Laravel怎么实现模型属性的自动加密
Firefox Developer Edition开发者版本入口
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Laravel Fortify是什么,和Jetstream有什么关系
JavaScript如何实现音频处理_Web Audio API如何工作?
Laravel如何处理文件下载请求?(Response示例)
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
微信小程序 require机制详解及实例代码
详解CentOS6.5 安装 MySQL5.1.71的方法
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
javascript中对象的定义、使用以及对象和原型链操作小结
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
JS实现鼠标移上去显示图片或微信二维码
Laravel如何处理CORS跨域请求?(配置示例)
如何确保FTP站点访问权限与数据传输安全?
Laravel如何实现多对多模型关联?(Eloquent教程)
企业网站制作这些问题要关注
高端企业智能建站程序:SEO优化与响应式模板定制开发
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
微信小程序 五星评分(包括半颗星评分)实例代码
利用 Google AI 进行 YouTube 视频 SEO 描述优化
如何在七牛云存储上搭建网站并设置自定义域名?
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
潮流网站制作头像软件下载,适合母子的网名有哪些?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
高防服务器租用指南:配置选择与快速部署攻略
如何确认建站备案号应放置的具体位置?
微信小程序 闭包写法详细介绍
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
北京企业网站设计制作公司,北京铁路集团官方网站?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
如何在建站之星绑定自定义域名?
如何做网站制作流程,*游戏网站怎么搭建?
Laravel观察者模式如何使用_Laravel Model Observer配置
HTML 中如何正确使用模板变量为元素的 name 属性赋值
Laravel如何升级到最新版本?(升级指南和步骤)
微信小程序制作网站有哪些,微信小程序需要做网站吗?
HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】
Laravel如何与Inertia.js和Vue/React构建现代单页应用
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
济南网站建设制作公司,室内设计网站一般都有哪些功能?

