Pandas 滚动窗口自定义函数应用:支持列名访问与任意维度输出的高效方案
发布时间 - 2026-01-30 00:00:00 点击率:次本文介绍如何在 pandas 中实现真正的滚动窗口(rolling window)自定义函数计算,突破 `rolling().apply()` 的限制(如强制 raw=true、输入输出列数绑定),通过 `numpy.sliding_window_view` 构建可按列名操作、灵活返回多列结果的高性能滚动处理流程。
在 Pandas 中,DataFrame.rolling().apply() 是最直观的滚动计算接口,但它存在两个关键限制:
- 当 raw=True 时,传入函数的是 numpy.ndarray,无法直接使用列名(如 window["A"])进行语义化操作;
- 当 raw=False 时,虽可获得 Series 或子 DataFrame,但返回值必须与原始列数严格一致,且仅支持标
量或同长数组,无法自然生成新增列(如输入 3 列 → 输出 4 列)。
官方 API 目前没有内置方法直接支持“带列名的滚动 DataFrame 切片 + 任意结构输出”。但借助 NumPy 底层能力,我们可以构建一个既保持代码清晰性、又兼顾性能的替代方案——numpy.lib.stride_tricks.sliding_window_view。
该函数可在不复制内存的前提下,将二维数组(如 df.values)按指定窗口形状(如 (2, 3) 表示 2 行 × 3 列)生成滑动视图,再逐个封装为轻量 pd.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)
})
# 定义滚动窗口大小(行数)和参与列
window_size = 2
cols = ["A", "B", "C"]
# 初始化结果列表:首行为 NaN(因窗口不足)
results = [tuple([np.nan] * 4)] # 假设输出 4 列:D, E, F, G
# 核心滚动处理:生成 (window_size, len(cols)) 形状的滑动块
for window_arr in sliding_window_view(df[cols].values, window_shape=(window_size, len(cols))):
# 将当前窗口数组转为临时 DataFrame(零拷贝)
window_df = pd.DataFrame(window_arr[0], columns=cols, copy=False)
# ✅ 现在可直接用列名操作!逻辑清晰、可读性强
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)✅ 优势总结:
- 列名友好:window_df["A"] 等写法完全兼容 Pandas 风格,便于调试与维护;
- 输出自由:返回任意长度元组,轻松扩展新列(不限于输入列数);
- 性能可控:sliding_window_view 为视图操作,copy=False 避免中间数据拷贝;
- 边界清晰:首行自动填充 NaN,符合滚动窗口语义(也可按需改为 min_periods 逻辑)。
⚠️ 注意事项:
- sliding_window_view 要求 NumPy ≥ 1.20;若版本较低,可用 np.lib.stride_tricks.as_strided 手动实现(需谨慎处理内存安全);
- 对超大规模数据(如百万行+),Python 层 for 循环可能成为瓶颈,此时建议将核心计算逻辑向量化(如用 np.sum(window_arr[:, 0], axis=0) 替代 window_df["A"].sum())或改用 Numba 加速;
- 若需时间序列对齐(如按日期索引滚动),请先确保 df 按时间排序,并在 sliding_window_view 前提取 .values,索引对齐由最终 concat 保证。
该方案在可读性、灵活性与性能之间取得了良好平衡,是目前 Pandas 生态中处理“复杂滚动计算 + 列名依赖 + 多输出”场景的推荐实践。
# python
# app
# win
# numpy
# pandas
# for
# 封装
# 循环
# 接口
# 切片
# copy
# 的是
# 是一个
# 而在
# 并在
# 也可
# 我们可以
# 请先
# 可在
# 自定义
# 较低
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
JS中对数组元素进行增删改移的方法总结
Bootstrap CSS布局之列表
微信小程序 wx.uploadFile无法上传解决办法
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
php485函数参数是什么意思_php485各参数详细说明【介绍】
如何用IIS7快速搭建并优化网站站点?
网站建设要注意的标准 促进网站用户好感度!
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
魔毅自助建站系统:模板定制与SEO优化一键生成指南
Android实现代码画虚线边框背景效果
C语言设计一个闪闪的圣诞树
如何在IIS7上新建站点并设置安全权限?
如何在IIS中新建站点并配置端口与物理路径?
利用python获取某年中每个月的第一天和最后一天
Laravel如何使用Blade组件和插槽?(Component代码示例)
如何快速搭建高效WAP手机网站?
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
个人摄影网站制作流程,摄影爱好者都去什么网站?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
zabbix利用python脚本发送报警邮件的方法
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
如何为不同团队 ID 动态生成多个独立按钮
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
Laravel如何实现文件上传和存储?(本地与S3配置)
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
Laravel怎么清理缓存_Laravel optimize clear命令详解
郑州企业网站制作公司,郑州招聘网站有哪些?
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
如何正确下载安装西数主机建站助手?
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
中山网站制作网页,中山新生登记系统登记流程?
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
js代码实现下拉菜单【推荐】
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
如何用西部建站助手快速创建专业网站?


