Pandas DataFrame周期性序列拆分教程:两种高效方法解析

Pandas DataFrame周期性序列拆分教程:两种高效方法解析

本教程详细介绍了如何将pandas dataframe根据重复的序列模式进行拆分,例如将公交线路的连续停靠站数据拆分为独立的行程。文章提供了两种主要方法:一种是利用groupby结合cumsum实现灵活拆分,适用于周期长度不固定的情况;另一种是使用numpy.array_split进行固定长度拆分,适用于周期结构一致的场景,并附有详细代码示例与应用建议。

在处理时间序列或顺序数据时,我们经常会遇到需要将一个大型数据集根据其中重复出现的特定模式(或“周期”)拆分为多个独立的子数据集的需求。例如,公交线路一天的停靠站数据可能包含多次往返行程,每个行程都遵循相同的停靠站顺序。本教程将展示如何利用Pandas和NumPy库高效地实现这种周期性拆分。

我们以一个公交线路停靠站的示例数据为例,该数据记录了某一线路在一天内的计划停靠时间及站点。目标是根据站点序列的重复模式,将整个DataFrame拆分成代表独立行程的子DataFrame。

首先,创建示例数据:

import pandas as pdimport numpy as npdf = pd.DataFrame({    "scheduled": ["2023-05-25 13:00", "2023-05-25 13:15", "2023-05-25 13:45",                  "2023-05-25 14:35", "2023-05-25 14:50", "2023-05-25 15:20"],    "stop": ["A", "B", "C", "A", "B", "C"]})df["scheduled"] = pd.to_datetime(df["scheduled"])print("原始DataFrame:")print(df)

输出的原始DataFrame如下:

原始DataFrame:            scheduled stop0 2023-05-25 13:00:00    A1 2023-05-25 13:15:00    B2 2023-05-25 13:45:00    C3 2023-05-25 14:35:00    A4 2023-05-25 14:50:00    B5 2023-05-25 15:20:00    C

可以看到,stop列呈现 A->B->C 的重复模式,我们需要将其拆分为两个独立的行程。

序列猴子开放平台 序列猴子开放平台

具有长序列、多模态、单模型、大数据等特点的超大规模语言模型

序列猴子开放平台 0 查看详情 序列猴子开放平台

方法一:基于groupby和cumsum的灵活拆分

这种方法适用于周期序列的长度可能不固定,或者我们希望通过识别每个周期的起始点来定义拆分的情况。它的核心思想是:识别出每个新周期的开始,并为每个周期分配一个唯一的组ID,然后利用Pandas的groupby功能进行拆分。

实现原理

识别周期起始点:我们假设每个周期都以相同的第一个站点开始。通过比较stop列的当前值是否等于整个序列的第一个站点,可以得到一个布尔序列,True表示一个新周期的开始。生成周期ID:对这个布尔序列应用cumsum()(累积求和),每次遇到True时,累积和就会增加1。这样,同一个周期内的所有行都会被分配相同的累积和值,从而形成一个唯一的组ID。执行分组:使用DataFrame.groupby()方法根据生成的组ID进行分组,并通过列表推导式提取每个组为一个独立的子DataFrame。

示例代码

# 1. 识别周期起始点并生成组ID# df['stop'].iloc[0] 获取第一个停靠站,例如 'A'# df['stop'].eq(df['stop'].iloc[0]) 找出所有等于 'A' 的行,返回布尔Series# .cumsum() 将布尔Series转换为累积和,True计为1,False计为0。# 例如:[T, F, F, T, F, F] -> [1, 1, 1, 2, 2, 2]group_id = df['stop'].eq(df['stop'].iloc[0]).cumsum()print("n生成的组ID:")print(group_id)# 2. 根据组ID进行分组并提取子DataFramesplit_dfs_groupby = [g for _, g in df.groupby(group_id)]print("n使用groupby和cumsum拆分后的DataFrame列表:")for i, sub_df in enumerate(split_dfs_groupby):    print(f"n子DataFrame {i+1}:")    print(sub_df)

输出结果

生成的组ID:0    11    12    13    24    25    2Name: stop, dtype: int64使用groupby和cumsum拆分后的DataFrame列表:子DataFrame 1:            scheduled stop0 2023-05-25 13:00:00    A1 2023-05-25 13:15:00    B2 2023-05-25 13:45:00    C子DataFrame 2:            scheduled stop3 2023-05-25 14:35:00    A4 2023-05-25 14:50:00    B5 2023-05-25 15:20:00    C

这种方法非常灵活,即使每个行程的停靠站数量(即周期长度)不完全一致,只要能通过识别起始站点来区分周期,它也能正确工作。

方法二:利用numpy.array_split的固定长度拆分

如果我们可以确定每个周期都包含相同数量的唯一元素,并且这些周期是连续且等长的,那么可以使用numpy.array_split方法进行更直接的拆分。这种方法依赖于预先计算出单个周期的长度。

实现原理

计算周期长度:通过DataFrame.nunique()方法,可以计算出stop列中唯一元素的数量,这通常代表了一个完整周期内的不同站点数量。确定拆分点:基于计算出的周期长度,生成一系列索引点,这些点将作为array_split的拆分位置。执行拆分:numpy.array_split()函数可以在指定的索引点将数组(或DataFrame)分割成多个子数组(或子DataFrame)。

示例代码

# 1. 计算单个周期的长度(即唯一停靠站的数量)# 例如,对于 'A', 'B', 'C',nunique() 将返回 3cycle_length = df['stop'].nunique()print(f"n计算出的周期

以上就是Pandas DataFrame周期性序列拆分教程:两种高效方法解析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/598171.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
提升家庭WiFi速度的实用技巧(优化家庭WiFi设置)
上一篇 2025年11月10日 19:14:05
SQL 数据库管理服务器全方位介绍 SQL 数据库管理服务器在数据管控中的独特功能与优势
下一篇 2025年11月10日 19:14:08

相关推荐

  • 使用 React.js 构建前端并与 PHP 后端交互

    本文旨在指导开发者如何使用 React.js 构建用户界面,并通过 REST API 与 PHP 后端进行数据交互。我们将介绍如何发起 HTTP 请求从 PHP 后端获取数据,并在 React 组件中展示这些数据。文章将提供代码示例,帮助你理解并实现前后端的数据交互。 1. PHP 后端 API 准…

    2025年12月12日
    000
  • Laravel 用户资料更新指南:常见问题与解决方案

    本文详细介绍了在 laravel 中更新用户资料时常见的错误及解决方案。核心问题通常源于 html 表单中缺少 name 属性导致数据未发送,以及控制器中 eloquent orm 更新方法的正确使用。通过修改 blade 模板中的表单字段、优化控制器逻辑并理解 laravel 的批量赋值机制,可以…

    2025年12月12日
    000
  • 将Python嵌套循环逻辑转换为PHP:数组生成与常见陷阱解析

    本文旨在指导读者如何将python中生成连续数字数组的循环逻辑高效地转换为php实现。我们将深入探讨在转换过程中可能遇到的常见陷阱,特别是php中数组元素赋值与追加的区别,并提供简洁、专业的php解决方案,帮助开发者避免不必要的复杂性,提升代码质量。 在软件开发中,经常需要将一种语言的逻辑迁移到另一…

    2025年12月12日
    000
  • PHP中高效查找扁平数组中特定值的方法

    本文旨在教授如何在php中高效地查找扁平数组中的特定值。我们将探讨 `in_array()` 函数的用法,它能帮助开发者快速判断一个值是否存在于数组中,并返回该值或指示其不存在。文章将通过代码示例详细阐述如何区分数组索引与值,并介绍 `in_array()` 的基本语法及其在实际应用中的优势,包括严…

    2025年12月12日
    000
  • PHP中foreach循环内引用失效问题详解

    本文旨在深入解析PHP中`foreach`循环内引用赋值失效的现象。通过对比直接引用赋值和`foreach`循环内引用赋值两种方式,揭示其背后的原因。同时,提供在`foreach`循环中修改数组元素的有效方法,帮助开发者避免踩坑,编写更健壮的PHP代码。 在PHP开发中,我们经常需要遍历数组并修改其…

    2025年12月12日
    000
  • PHP依赖注入怎么实现_PHP依赖注入容器实践

    依赖注入通过外部传入依赖降低耦合,手动注入适用于简单场景,复杂项目推荐使用DI容器自动管理对象创建与依赖解析。 依赖注入(Dependency Injection,简称DI)不是PHP独有的概念,而是一种设计模式,用来降低类之间的耦合度。在PHP中实现依赖注入,核心思想是:不直接在类内部创建依赖对象…

    2025年12月12日
    000
  • 动态生成提交按钮名称的PHP教程

    本文旨在解决如何使用PHP动态生成HTML表单中提交按钮的名称,并处理相应的POST请求。通过从数据库读取数据,并将其作为按钮的名称,我们提供了一种简洁且易于维护的方法。文章将详细介绍如何使用PHP从数据库获取数据,然后在HTML表单中动态生成按钮,以及如何处理这些按钮的提交事件。 在Web开发中,…

    2025年12月12日
    100
  • 使用 PHP DOMDocument 向现有 XML 文件追加新节点:完整教程

    本教程详细阐述如何使用 php 的 domdocument 类向现有 xml 文件追加新节点。文章涵盖了 xml 文件的正确加载与格式化、准确获取目标父节点、以及使用 `createelement` 方法高效创建并关联新节点到文档树的关键步骤。通过避免常见错误和提供完整示例代码,帮助开发者掌握 xm…

    2025年12月12日
    000
  • 使用 Ajax 和 FormData 实现文件上传及文本数据提交的完整教程

    本文旨在解决在使用 Ajax 和 FormData 进行文件上传时,遇到的 $_POST 和 $_FILES 为空的问题。通过详细的代码示例和解释,我们将展示如何正确地构建 FormData 对象,并通过 Ajax 将文件和文本数据发送到服务器端,同时避免常见的错误配置,确保数据能够成功地被 PHP…

    2025年12月12日
    000
  • PHP三元运算符如何避免错误_PHP三元运算符常见陷阱

    正确使用PHP三元运算符需避免嵌套混乱、未定义变量错误、布尔判断误区及赋值混淆。1. 避免多重嵌套,用括号明确优先级或改用if-else;2. 用isset()或??运算符防止Undefined variable警告;3. 明确判断条件,避免隐式转换导致逻辑错误;4. 区分==与=,防止误赋值。代码…

    2025年12月12日
    100
  • PHP三元运算符缺点是什么_PHP三元运算符潜在问题

    三元运算符适合简单判断,但嵌套使用会降低可读性,如 $result = $a ? ($b ? $c : $d) : $e;PHP中?:左关联易引发逻辑错误,如 $a ?: $b ?: $c 等价于 ($a ?: $b) ?: $c;调试困难且无法设断点;复杂逻辑扩展性差,后续添加日志或多步判断需重构…

    2025年12月12日
    000
  • php中全局变量和局部变量有什么区别_php中全局与局部变量作用域详解

    局部变量在函数内定义并仅限函数内使用,函数执行完后即销毁;全局变量在函数外定义,可在脚本的非函数区域访问,但在函数内需通过global关键字或$GLOBALS数组才能访问和修改。 在PHP中,变量的作用域决定了它在脚本的哪些部分可以被访问。全局变量和局部变量的主要区别在于它们的定义位置和可访问范围。…

    2025年12月12日
    000
  • 递增操作符在PHP CLI脚本中的应用_PHP命令行递增计数器

    递增操作符(++)是PHP CLI脚本中实现计数器的核心工具,适用于循环、日志、进度追踪等场景。前置递增(++$i)返回新值,后置递增($i++)返回原值,两者在简单计数中效果相近但语义不同。例如在while循环中使用++$i可立即输出递增后的值,适合需要实时反映状态的场合。处理大文件时,可通过++…

    2025年12月12日
    100
  • 利用php递归函数实现深层合并_通过php递归函数合并复杂数组

    深层合并需用递归函数处理多层嵌套数组,通过判断元素是否为数组决定递归或直接赋值,确保子数组不被覆盖。示例函数array_deep_merge可合并默认与自定义配置,保留非冲突键并更新深层值,适用于复杂结构的智能合并场景。 在PHP中处理复杂嵌套数组时,简单的合并方式(如array_merge)往往无…

    2025年12月12日
    000
  • PHP一键环境为什么Apache服务无法启动_Apache启动失败解决

    端口占用:80端口被IIS、Skype等程序占用,可通过netstat查PID并结束进程,或修改httpd.conf中Listen端口为8080;2. 配置错误:检查httpd.conf语法,使用httpd.exe -t检测错误,必要时恢复默认配置;3. 运行库或权限问题:安装VC++运行库,以管理…

    2025年12月12日
    000
  • PHP一键环境日志文件在哪查看_错误日志与访问日志分析

    错误日志通常位于各环境的logs目录下,如宝塔在/www/wwwlogs/php_error.log,phpStudy在phpstudy_proExtensionsphp_logs,XAMPP在xamppapachelogserror.log,WampServer在wampbinapacheApac…

    2025年12月12日
    000
  • PHP一键环境怎么配置邮件发送功能_SMTP邮件配置

    要让PHP一键环境支持邮件发送,需配置SMTP服务。首先修改php.ini中的[mail function]参数,设置SMTP服务器、端口和发件人邮箱;推荐使用PHPMailer类库实现更稳定的邮件发送,需配置Host、SMTPAuth、Username(邮箱账号)、Password(授权码而非登录…

    2025年12月12日
    000
  • Elementor主题构建器:动态显示分类归档文章的简易方法

    本教程旨在解决elementor自定义归档页面中,如何动态显示特定分类文章的问题。通过利用elementor主题构建器的“归档文章”小部件并将其查询设置为“当前查询”,用户可以无需编写自定义代码,即可轻松实现文章根据其所属分类在对应归档页面上自动展示,从而简化了动态内容管理。 在使用Elemento…

    2025年12月12日
    000
  • Laravel请求参数类型识别与处理:从字符串到精准数据类型

    在处理Web应用程序,尤其是使用Laravel等框架时,开发者经常需要从HTTP请求中获取用户输入。这些输入可能包括URL查询参数、表单数据或JSON负载。一个普遍的误解是,如果用户在URL中输入一个数字,例如`?amount=99.9`,那么在后端获取到的`amount`变量就会自动识别为浮点数或…

    2025年12月12日
    000
  • 将NPM模块集成到PHP/静态网站的现代实践

    在php或静态网站中整合npm模块时,直接引用`node_modules`路径并非最佳实践。推荐采用前端构建工具(如webpack、vite)进行资源打包和优化,以实现代码摇树、文件精简。对于小型项目,可考虑使用cdn服务直接引入模块,或手动复制所需文件,但后者维护成本较高。理解这些方法有助于构建高…

    2025年12月12日
    000

发表回复

登录后才能评论
关注微信