讲师中心 微信公众号
AI工具推荐 视频效率加速

Pandas中基于类别变化的滚动差值计算

阿涛同学_2311

阿涛同学_2311

发布时间:2025-10-13 12:10:23

|

1010人浏览过

|

来源于php中文网

原创

Pandas中基于类别变化的滚动差值计算

本文详细介绍了如何在pandas dataframe中高效计算一个数值列(如时间戳)相对于其所属分组起始值的差值,其中分组的定义是基于另一个分类列连续值变化的。通过利用`groupby.transform('first')`和`cumsum()`等pandas向量化操作,可以避免低效的循环,实现高性能的数据处理。

引言:高效计算基于类别变化的滚动差值

在数据分析和处理中,我们经常会遇到需要计算某个数值序列相对于特定事件发生时间点的差值。一个常见的场景是,当数据集中存在一个分类变量时,我们希望计算另一个数值变量(例如时间戳)自该分类变量上一次发生变化以来的累计差值。例如,在一个包含传感器读数的数据集中,我们可能需要计算每个读数距离当前“模式”开始的时间。如果直接使用循环遍历DataFrame的每一行来判断分类变量是否变化并进行计算,这在处理大型数据集时会非常低效。本教程将展示如何利用Pandas库的向量化操作,以一种高性能的方式解决这个问题。

问题描述

假设我们有一个Pandas DataFrame,其结构如下:

A t X
1 0.0 0
1 3.2 3.2
1 3.9 3.9
1 18.0 18
1 27.4 27.4
3 47.4 0
3 50.2 2.9
3 57.2 9.8
3 64.8 17.4
3 76.4 29.1
2 80.5 0
1 85.3 0
1 87.4 2.1

其中:

  • A 是一个分类变量,表示某个类别或状态。
  • t 是一个数值变量,通常表示时间戳(单位为秒)。
  • X 是我们期望计算的输出列,它表示自列A的值上一次发生变化以来的秒数。当A的值发生变化时,X应重置为0。

我们的目标是填充列X,使其准确反映自A列值变化以来的时间差。

解决方案:利用Pandas向量化操作

Pandas提供了一系列强大的向量化操作,可以高效地处理这类问题。核心思路是首先识别出A列连续值相同的各个“组”,然后对于每个组,找到其t列的第一个值(即该组的起始时间),最后用当前行的t值减去该组的起始时间。

以下是实现这一目标的具体步骤和代码:

步骤一:识别连续相同的分组

为了将A列中连续相同的值划分为不同的组,我们可以利用shift()和ne()(不等于)方法来检测A列值何时发生变化,然后使用cumsum()来为每个连续的组生成一个唯一的标识符。

  • df['A'].shift():将A列向下移动一行,这样可以比较当前行与上一行的值。
  • df['A'].ne(df['A'].shift()):创建一个布尔序列,当当前行A的值与上一行不同时为True,否则为False。这准确标记了A列值发生变化的位置。
  • .cumsum():对布尔序列进行累积求和。由于True被视为1,False被视为0,每当A列值发生变化(即True出现)时,累积和就会增加1,从而为每个连续的组分配一个唯一的整数ID。
import pandas as pd

# 示例数据
data = {
    'A': [1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 2, 1, 1],
    't': [0.0, 3.2, 3.9, 18.0, 27.4, 47.4, 50.2, 57.2, 64.8, 76.4, 80.5, 85.3, 87.4]
}
df = pd.DataFrame(data)

# 步骤一:识别连续相同的分组
group = df['A'].ne(df['A'].shift()).cumsum()
print("分组标识符 (group):\n", group)

输出的group序列将如下所示:

分组标识符 (group):
 0     1
 1     1
 2     1
 3     1
 4     1
 5     2
 6     2
 7     2
 8     2
 9     2
 10    3
 11    4
 12    4
Name: A, dtype: int64

可以看到,A列值为1的第一个连续块被标记为组1,A列值为3的连续块被标记为组2,依此类推。

Forge — Python Developer
Forge — Python Developer

Python开发助手 — 自动化脚本、API封装、命令行工具、数据管道、网页爬虫。经过测试的代码,包含错误处理和文档。当你需要...

下载

步骤二:获取每个组的起始时间

接下来,我们需要为每个识别出的组获取其t列的第一个值。groupby().transform('first')方法非常适合这个任务:

  • df.groupby(group):根据上一步生成的group标识符对DataFrame进行分组。
  • ['t'].transform('first'):对每个分组的t列应用transform('first')操作。transform方法会将结果广播回原始DataFrame的形状,这意味着对于每个组内的所有行,它都会返回该组t列的第一个值。
# 步骤二:获取每个组的起始时间
first_t_per_group = df.groupby(group)['t'].transform('first')
print("\n每个组的起始时间 (first_t_per_group):\n", first_t_per_group)

输出的first_t_per_group序列将如下所示:

每个组的起始时间 (first_t_per_group):
 0     0.0
 1     0.0
 2     0.0
 3     0.0
 4     0.0
 5    47.4
 6    47.4
 7    47.4
 8    47.4
 9    47.4
 10   80.5
 11   85.3
 12   85.3
Name: t, dtype: float64

现在,first_t_per_group序列中的每一行都对应着它所属分组的起始时间。

步骤三:计算滚动差值

最后一步是计算当前行的t值与它所属组的起始时间之间的差值。这可以通过简单的列相减来完成:

# 步骤三:计算滚动差值
df['X'] = df['t'].sub(first_t_per_group)
print("\n最终结果 (df):\n", df)

完整代码示例

将以上步骤整合到一起,完整的解决方案代码如下:

import pandas as pd

# 示例数据
data = {
    'A': [1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 2, 1, 1],
    't': [0.0, 3.2, 3.9, 18.0, 27.4, 47.4, 50.2, 57.2, 64.8, 76.4, 80.5, 85.3, 87.4]
}
df = pd.DataFrame(data)

# 1. 识别连续相同的分组
# 当'A'列的值与上一行不同时,生成True,然后累积求和作为分组标识符
group = df['A'].ne(df['A'].shift()).cumsum()

# 2. 获取每个组的起始时间
# 对每个分组,获取't'列的第一个值,并将其广播回原始DataFrame的形状
first_t_per_group = df.groupby(group)['t'].transform('first')

# 3. 计算滚动差值
# 用当前行的't'值减去其所属组的起始时间
df['X'] = df['t'].sub(first_t_per_group)

print(df)

输出结果

运行上述代码将得到以下DataFrame:

    A      t      X
0   1    0.0    0.0
1   1    3.2    3.2
2   1    3.9    3.9
3   1   18.0   18.0
4   1   27.4   27.4
5   3   47.4    0.0
6   3   50.2    2.8
7   3   57.2    9.8
8   3   64.8   17.4
9   3   76.4   29.0
10  2   80.5    0.0
11  1   85.3    0.0
12  1   87.4    2.1

结果中的X列准确地反映了自A列值上一次变化以来的时间差。例如,当A从1变为3时(索引5),X重置为0;当A从3变为2时(索引10),X再次重置为0。

注意事项与总结

  1. 性能优势: 这种方法完全基于Pandas的向量化操作,避免了Python原生的for循环,因此在处理大型数据集时具有显著的性能优势。
  2. 数据类型: 确保用于计算差值的列(例如t)是数值类型。如果它是字符串或其他非数值类型,需要先进行类型转换。
  3. shift()的默认行为: shift()在第一行会引入NaN。ne()与NaN的比较结果通常是True(因为NaN != anything,包括NaN自身),这使得第一个分组的标识符从1开始,符合预期。
  4. 通用性: 这种模式不仅限于计算时间差,也可以用于计算其他数值相对于组内第一个值的差值、比例或其他统计量,只要将transform('first')替换为其他聚合函数(如transform('mean'), transform('min')等)即可。

通过掌握groupby().transform()与shift().cumsum()的组合使用,您可以高效地解决许多涉及基于连续分组进行计算的数据处理问题,极大地提升数据分析的效率和代码的简洁性。

热门AI工具

更多
LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

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

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

320

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

252

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

511

2026.04.13

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2851

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

534

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

482

2026.02.12

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

14000

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1083

2024.02.23

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn