0

0

Pandas 滚动窗口自定义函数应用:支持列名访问与灵活输出维度的高效实现

聖光之護

聖光之護

发布时间:2026-01-30 18:55:01

|

245人浏览过

|

来源于php中文网

原创

Pandas 滚动窗口自定义函数应用:支持列名访问与灵活输出维度的高效实现

本文介绍如何在 pandas 中对 dataframe 执行滚动窗口计算,突破 `rolling().apply()` 的限制(如无法按列名访问、强制输入输出列数一致),结合 numpy 的 `sliding_window_view` 构建可读性强、性能可控、完全支持 dataframe 语义的操作方案。

在 Pandas 中,DataFrame.rolling(window).apply(func) 是最常用的滚动计算接口,但其存在两个关键局限:一是当启用 raw=True 时,传入函数的是 numpy.ndarray,丢失列名信息,无法使用 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 避免数据冗余),从而在保留列名访问能力的同时,自由定义任意逻辑并返回任意长度的结果元组。

Tome
Tome

先进的AI智能PPT制作工具

下载

以下是一个生产就绪的完整示例:

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 最擅长的列导向表达能力,是中高级数据分析流程中的实用利器。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

68

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接口编写教程,阅读专题下面的文章了解更多详细内容。

213

2025.10.17

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

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

1901

2025.12.29

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

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

22

2026.01.19

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

硬盘接口类型有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接口编写教程,阅读专题下面的文章了解更多详细内容。

213

2025.10.17

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

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

1901

2025.12.29

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

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

9

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号