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

相关推荐

  • 将 Pandas 与面向对象编程相结合:构建可维护的数据分析流程

    本文探讨了在数据分析中使用 Pandas 结合面向对象编程 (OOP) 的方法。面对日益复杂的数据处理任务,传统的函数式编程可能难以维护。通过将数据结构封装成类,并利用 OOP 的设计模式,可以提高代码的可读性、可维护性和可扩展性。本文将介绍如何利用 OOP 思想来组织 Pandas 数据处理流程,…

    2026年5月10日
    000
  • 小程序表格数据如何换行显示?

    如何让小程序表格中的数据在新的一行显示? 在小程序中创建表格时,如果表格内容过多,需要在新的一行显示,可以通过设置 table_row 组件的样式为 flex-wrap:wrap 来实现。 这样,表格中的剩余信息就会自动换行显示,并附着在每一行的下一行。 示例代码: .table__row { fl…

    2026年5月10日
    000
  • js 如何用pluck提取对象数组的某个属性

    使用原生javascript的map方法是提取对象数组属性最推荐的方式,它通过遍历数组并对每个元素执行回调函数来生成新数组,代码简洁且符合函数式编程理念;2. lodash库的_.map方法也可实现该功能,尤其在已使用lodash的项目中可提升可读性和链式调用便利性,但需注意_.pluck已被弃用;…

    2026年5月10日
    000
  • C++ 如何使用 for-each 循环 (基于范围的 for 循环)_C++ 范围 for 循环遍历容器方法

    C++11引入的基于范围的for循环使遍历更简洁,语法为for (declaration : range),可直接遍历数组或容器,如int arr[] = {1,2,3,4,5}; for (int x : arr)输出各元素。 C++11 引入了基于范围的 for 循环(range-based f…

    2026年5月10日
    000
  • Go语言代码格式化:gofmt与制表符的官方推荐

    go语言官方推荐使用`gofmt`工具自动格式化代码,其默认缩进方式为制表符(tabs)。本文将详细阐述go语言的缩进规范,解释`gofmt`如何确保代码风格一致性,并指导开发者如何遵循官方建议,以提升代码可读性和团队协作效率。 Go语言在设计之初就非常注重代码的简洁性、可读性和一致性。为了达到这一…

    2026年5月10日
    000
  • HTMLnav语义化怎么设计_HTML导航栏的语义化标签选择与布局方法

    使用nav标签定义导航区域,结合ul和li构建结构,通过aria-label和aria-current提升可访问性,保持语义化与响应式设计统一,增强SEO与用户体验。 在构建网页时,HTML导航栏的语义化设计不仅能提升代码可读性,还能增强网页的可访问性和SEO效果。合理使用语义化标签,让浏览器和辅助…

    2026年5月10日
    000
  • 如何将一个页面中的 div 内容加载到另一个页面中的 div?

    将一个页面中的 div 内容加载到另一个页面中的 div 在实际开发中,有时我们会遇到需要将一个页面中的 div 内容加载到另一个页面中的 div 的需求。举个例子,页面一中有如下内容: document.getelementbyid(“result”).innerhtml = “用户代码:”; 页…

    2026年5月10日
    200
  • 云原生中的金丝雀发布如何自动化?

    金丝雀发布自动化通过集成工具链与策略编排,实现流量控制、监控判断与流程编排闭环。1. 利用Istio VirtualService或Argo Rollouts等工具动态分流;2. 通过Prometheus与Spinnaker ACA分析指标并量化评分;3. 在CI/CD流水线中嵌入声明式发布策略,自…

    2026年5月10日
    000
  • XML 数据解析:PHP 中提取 XML 节点键的完整指南

    本文详细介绍了如何使用 PHP 解析 XML 数据并提取所有节点键。通过结合 SimpleXMLElement 和递归函数,可以有效地遍历 XML 结构,获取包括嵌套节点在内的所有键名。文章提供了一个完整的代码示例,展示了如何实现这一功能,并解释了关键步骤和注意事项。无论您是处理简单的 XML 文件…

    2026年5月10日
    000
  • 深入解析head标签中常用的头部标签

    深入解析head标签中常用的头部标签深入解析head标签中常用的头部标签深入解析head标签中常用的头部标签深入解析head标签中常用的头部标签

    标签的内容必须与当前文档有关,并且不应该过长,中文页面请尽量控制在 30 个字符(包括空格)以内。 2、 标签 标签用于为页面中所有相对链接指定一个基本链接,当您设置了基本链接后,当前页面中的所有相对链接都会使用这个基本链接作为前缀,如下例所示: 标签演示 视频教程 入门教程 上面的示例中第一个 标…

    2026年5月10日 用户投稿
    000
  • PHP格式化表单输入数据的技巧_PHP格式化表单输入数据的实用技巧

    首先去除空白并统一大小写,再过滤特殊字符,接着验证邮箱格式,最后标准化电话号码。具体为:使用trim()和preg_replace()清理空格,strtolower()或ucwords()统一大小写,htmlspecialchars()和strip_tags()防止XSS,filter_var()验…

    2026年5月10日
    000
  • 实现前端数据按用户ID过滤:方法、局限与最佳实践

    本文探讨如何在前端JavaScript中根据当前登录用户ID过滤并显示特定数据,例如只显示用户创建的职位列表。我们将提供具体的代码实现,并深入分析前端过滤存在的安全与性能隐患,最终强调后端数据过滤作为更专业、更安全的最佳实践。 1. 前端数据过滤需求与现有问题 在web应用开发中,常见需求之一是根据…

    2026年5月10日
    000
  • FloppyPepe:2025年在Solana上展现实用性的模因币

    忘记短暂的炒作吧!floppypepe(fppe)在 solana 上将模因魔力与创作者工具结合,正成为有望实现百倍增长的有力竞争者。这会是下一个模因传奇吗? 加密市场的模因币狂热远未结束,但规则正在改变。Solana 充满活力的生态系统正在孕育新一代模因币,而 FloppyPepe(FPPE)正引…

    2026年5月10日
    000
  • 币安binanceapp官方下载安装 币安2025安卓最新版本入口地址

    币安binanceapp官方下载安装 币安2025安卓最新版本入口地址币安binanceapp官方下载安装 币安2025安卓最新版本入口地址币安binanceapp官方下载安装 币安2025安卓最新版本入口地址币安binanceapp官方下载安装 币安2025安卓最新版本入口地址

    币安(Binance)是全球领先的数字资产交易平台之一,为用户提供安全、稳定、便捷的数字货币交易服务。它支持多种主流及新兴的数字资产,并提供丰富的交易工具和功能。 本文将为您提供币安2025安卓最新版本的官方下载入口,您只需点击文中给出的下载链接,即可获取官方正版app安装包,开启您的数字资产之旅。…

    2026年5月10日 用户投稿
    000
  • php怎么用php打开手机_PHP移动端访问与响应式设计方法教程

    答案:通过PHP实现移动设备兼容需检测用户代理、使用响应式模板、路由移动内容及优化性能。1. 利用HTTP_USER_AGENT识别移动设备并加载适配模板;2. 结合Bootstrap等框架与PHP动态填充内容,确保HTML具备响应式布局;3. 通过PHP路由将移动用户导向专用页面如mobile_h…

    2026年5月10日
    200
  • 给WordPress帖子添加过期日期

    我运行了一些网站,这些网站在其主页的横幅中包含通知和重要信息。我倾向于为此使用自定义帖子类型,添加横幅并在主题中需要的位置显示它们。 (如果您想做类似的事情,本教程中对此进行了解释。) 但我的横幅总是有到期日。例如,它们可能包含有关即将举行的活动或职位空缺的信息。一旦活动结束或职位空缺被填补,我就必…

    2026年5月10日
    000
  • CSS导航栏精确对齐:移除列表默认左侧内边距的实用指南

    本文旨在解决网页导航栏链接因浏览器默认样式导致左侧不对齐的问题。核心在于理解并重置元素自带的padding-inline-start内边距,而非仅调整元素的样式。通过简单的CSS规则,即可实现导航链接与页面其他内容的完美对齐,提升页面布局的精确性和专业性。 在网页布局中,尤其是构建导航栏时,开发者经…

    2026年5月10日
    200
  • Electron应用中无法设置元素宽高的问题解决

    本文旨在解决Electron应用开发中,CSS样式无法正确设置元素宽高的问题。通过分析常见原因,提供详细的解决方案和最佳实践,帮助开发者避免类似错误,确保应用界面元素的尺寸符合预期。 在Electron应用开发过程中,经常会遇到需要精确控制元素宽高的情况。然而,有时即使在CSS中设置了width和h…

    2026年5月10日
    000
  • c++怎么用std::async和std::future进行异步编程_c++ std::async与std::future使用方法

    std::async与std::future用于异步任务执行和结果获取,通过get()获取返回值或异常,支持async和deferred启动策略,需注意调用get()避免阻塞析构。 在C++11中,std::async 和 std::future 提供了一种简单的方式来执行异步任务并获取其结果。它们…

    2026年5月10日
    000
  • 如何提升 C++ 函数执行效率?

    提升 c++++ 函数执行效率的技巧包括:避免不必要的复制拷贝、使用局部变量、减少函数调用开销、使用内联函数、优化循环、使用缓存。 如何提升 C++ 函数执行效率? 在 C++ 中编写高性能代码时,优化函数效率至关重要。以下是一些提升函数执行效率的实用技巧: 避免不必要的复制 拷贝大型对象可能会非常…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信