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

y,丢失列名信息,无法使用 df["A"] 等语义;二是 apply 要求返回值形状必须与原始 DataFrame 列数严格匹配(即每列输出一个标量),难以支持“多输入 → 少/多输出列”的灵活场景(例如基于 A/B/C 三列计算出 D/E/F/G 四个新特征)。

官方 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核心路由系统完全入门指南  济南网站建设制作公司,室内设计网站一般都有哪些功能?