0

0

Pandas 滚动窗口自定义函数应用:支持列名访问与任意维度输出的高效方案

霞舞

霞舞

发布时间:2026-01-30 20:19:00

|

172人浏览过

|

来源于php中文网

原创

Pandas 滚动窗口自定义函数应用:支持列名访问与任意维度输出的高效方案

本文介绍如何在 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 进一步避免冗余拷贝),从而在函数体内自由使用列名、执行复杂逻辑,并返回任意长度的结果元组。

以下是一个完整、可复用的实现示例:

万兴爱画
万兴爱画

万兴爱画AI绘画生成工具

下载
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 生态中处理“复杂滚动计算 + 列名依赖 + 多输出”场景的推荐实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

69

2025.12.04

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1155

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

215

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1983

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

22

2026.01.19

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

46

2025.09.03

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

46

2025.09.03

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

8

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号