使用 Pandas cummax() 维护序列中的历史最大值

使用 Pandas cummax() 维护序列中的历史最大值

本文将深入探讨如何利用 pandas 库中的 `cummax()` 函数,高效地在 dataframe 中创建一个新列,该列能够追踪并保留序列中迄今为止遇到的最大值。通过一个实际案例,我们将展示 `cummax()` 如何简洁而准确地实现复杂的数据累计最大值保持逻辑,避免手动迭代的繁琐,从而优化数据处理流程。

引言:追踪并维护序列中的历史最大值

在数据分析和处理中,我们经常会遇到需要在一个序列中追踪并保留迄今为止所遇到的最大值(或最小值)的需求。例如,在金融数据分析中,可能需要跟踪股票价格的历史最高点;在性能监控中,可能需要记录系统的峰值负载。这类问题通常要求创建一个新列,其值在遇到更大的新值时更新,否则保持上一个最大值。虽然这类逻辑听起来可能有些复杂,但 Pandas 库提供了一个非常简洁且高效的内置函数来解决它。

数据准备

首先,我们通过一个示例 DataFrame 来阐述这个问题。假设我们有一个包含数值列 a 的 DataFrame,我们希望创建一个新列 c,使其在每个点上都表示 a 列从开始到当前位置的最大值。

import pandas as pddf = pd.DataFrame(    {        'a': [110, 115, 112, 180, 150, 175, 160, 145, 200, 205, 208, 203, 206, 207, 208, 209, 210, 215],        'b': [1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1], # 列 'b' 在本教程中不直接用于计算 'c'    })print("原始 DataFrame:")print(df)

原始 DataFrame 输出:

      a  b0   110  11   115  12   112  03   180  14   150  05   175  16   160  07   145  08   200  19   205  110  208  111  203  012  206  113  207  114  208  115  209  116  210  117  215  1

问题分析与期望结果

原始问题描述中,用户试图通过一个辅助列 b 来标识 a 列的递增趋势,并进一步构思了复杂的“连胜(streak)”概念,希望在连胜结束时保留连胜期间的最大值,直到遇到更大的新值才更新。然而,仔细分析用户提供的期望输出 c 列,可以发现其行为模式实际上与 pandas.Series.cummax() 函数的功能完全一致。也就是说,c 列在任何时刻都存储着 a 列从开始到当前位置所遇到的最大值。

期望输出 c 列的逻辑:

c 的第一个值是 a 的第一个值。对于后续的每一个位置,c 的值是当前 a 的值与前一个 c 的值中的较大者。

例如:

c[0] = a[0] = 110c[1] = max(a[1], c[0]) = max(115, 110) = 115c[2] = max(a[2], c[1]) = max(112, 115) = 115 (因为 112 不大于 115)c[3] = max(a[3], c[2]) = max(180, 115) = 180以此类推…

解决方案:pandas.Series.cummax()

Pandas 库为这种累积计算提供了专门的函数,其中 Series.cummax() 就是用于计算序列累积最大值的函数。它会遍历 Series 中的每个元素,并返回一个新 Series,其中每个位置的值是到该位置为止所有元素的累积最大值。

实现代码:

# 使用 cummax() 计算列 'c'df['c'] = df['a'].cummax()print("n生成 'c' 列后的 DataFrame:")print(df)

输出结果:

      a  b    c0   110  1  1101   115  1  1152   112  0  1153   180  1  1804   150  0  1805   175  1  1806   160  0  1807   145  0  1808   200  1  2009   205  1  20510  208  1  20811  203  0  20812  206  1  20813  207  1  20814  208  1  20815  209  1  20916  210  1  21017  215  1  215

从输出结果可以看出,df[‘c’] = df[‘a’].cummax() 完美地实现了期望的逻辑,即在 a 列中遇到更大的值时更新 c,否则保持当前的最大值。

cummax() 函数详解

pandas.Series.cummax() 是一个强大的函数,它属于 Series 对象的方法,用于执行累积最大值计算。

工作原理:

它从 Series 的第一个元素开始。对于每个元素,它将其与之前所有元素的累积最大值进行比较。如果当前元素大于累积最大值,则累积最大值更新为当前元素的值。否则,累积最大值保持不变。这个累积最大值被记录在新 Series 的对应位置。

参数说明:

axis: 默认为 None。对于 Series,此参数没有意义。对于 DataFrame,可以指定按行或按列计算。skipna: 默认为 True。表示在计算时跳过 NaN(非数字)值。如果设置为 False,则 NaN 值将传播,即如果累积过程中遇到 NaN,则后续结果都将是 NaN。

示例(skipna 参数):

s = pd.Series([1, 3, None, 2, 5])# skipna=True (默认行为)print("skipna=True:")print(s.cummax())# 输出: 0    1.0#       1    3.0#       2    3.0 (None 被跳过,保留前一个最大值)#       3    3.0#       4    5.0#       dtype: float64# skipna=Falseprint("nskipna=False:")print(s.cummax(skipna=False))# 输出: 0    1.0#       1    3.0#       2    NaN (遇到 None 后传播 NaN)#       3    NaN#       4    NaN#       dtype: float64

注意事项与总结

简洁性与效率: cummax() 函数是高度优化的 C 语言实现,比手动编写循环来计算累积最大值要快得多,尤其是在处理大型数据集时。问题澄清: 在实际工作中,有时对问题的描述可能比实际需求更复杂。本案例中,尽管原始问题描述了复杂的“连胜”和 b 列逻辑,但最终期望的 c 列输出却直接对应 cummax() 的功能。因此,理解核心需求并将其映射到 Pandas 的内置功能是高效解决问题的关键。适用场景: cummax() 不仅适用于追踪数值序列的历史最大值,其对应的 cummin() 可用于追踪历史最小值,cumsum() 用于累积和,cumprod() 用于累积乘积。这些函数在时间序列分析、性能指标计算、数据规范化等多种场景下都非常有用。

通过 pandas.Series.cummax(),我们可以以极高的效率和简洁性解决在 DataFrame 中维护历史最大值的问题。掌握这类内置函数是提升 Pandas 数据处理能力的重要一步。

以上就是使用 Pandas cummax() 维护序列中的历史最大值的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 23:21:20
下一篇 2025年12月14日 23:21:31

相关推荐

  • 使用JavaScript实现动态货币转换:多价格同步更新与避免重复计算的教程

    本教程将指导您如何使用javascript动态地将多个价格转换为不同货币,并同步更新显示。我们将探讨如何从外部api获取汇率、正确选择和更新多个html元素,以及如何通过存储初始值来避免在多次转换中出现累积计算错误,确保价格始终基于原始值进行准确转换。 在现代Web应用中,动态货币转换是一个常见的需…

    2025年12月23日
    000
  • 动态货币汇率转换与多元素更新教程

    本教程详细介绍了如何使用javascript实现动态货币汇率转换,并确保转换结果能正确应用于页面上的多个显示元素。文章着重解决了常见的开发陷阱,如仅更新第一个元素、重复转换导致数值错误等,通过引入`queryselectorall`、存储原始值和优化数据结构,提供了一套健壮且易于维护的解决方案,适用…

    2025年12月23日
    000
  • 动态货币转换:JavaScript实现多价格元素实时更新教程

    本教程详细介绍了如何使用%ignore_a_1%实现网页上多个价格元素的动态货币转换功能。文章将涵盖从api获取汇率、正确选择和管理dom元素、存储初始价格以避免累积转换错误,以及通过事件监听器实时更新显示价格的关键步骤,确保转换逻辑的准确性和可扩展性。 在现代Web应用中,动态显示商品价格并允许用…

    2025年12月23日
    000
  • Django模型中利用save()方法自动计算可用余额

    本文详细阐述了如何在Django模型中,通过覆盖`save()`方法,实现根据现有字段(如`current_balance`和`amount_input`)自动计算并更新派生字段`available_balance`。这种方法确保了数据的一致性,简化了业务逻辑,并为在网页上展示动态余额提供了可靠的后…

    2025年12月23日
    000
  • HTML表单数据加密怎么处理_HTML表单敏感数据前端加密的方法与实现

    前端加密可补充HTTPS,防止敏感数据在用户端被窃取。通过RSA非对称加密、AES动态密钥或哈希处理等方式,在表单提交前对密码等信息加密,结合后端协作实现安全传输,降低中间人攻击与数据泄露风险。 在Web开发中,HTML表单常用于收集用户信息,包括登录凭证、身份证号、银行卡等敏感数据。虽然HTTPS…

    2025年12月23日
    000
  • JavaScript根据本地时间控制元素可见性:简化时间区间判断

    本文详细介绍了如何使用javascript根据用户的本地时间来控制网页元素的显示与隐藏。我们将重点讲解如何避免复杂的时区偏移计算,通过new date().gethours()直接获取当前小时,并构建准确的逻辑条件来判断跨午夜的时间区间,从而实现例如在营业时间外自动隐藏特定字段的功能。 在网页开发中…

    2025年12月23日
    000
  • 利用JavaScript根据本地时间动态隐藏/显示网页元素教程

    本教程详细讲解如何使用javascript根据用户的本地时间动态控制网页元素的显示与隐藏。文章首先解析了 `gettimezoneoffset` 的常见误解,随后提供了一个更简洁高效的解决方案,即直接获取浏览器本地小时数进行判断。通过清晰的代码示例和逻辑分析,帮助开发者轻松实现基于时间段的元素可见性…

    2025年12月23日
    000
  • html5文件如何实现区块链存证 html5文件哈希值上链的流程

    生成HTML5文件的SHA-256哈希值并记录;2. 选择支持数据上链的区块链平台并获取访问权限;3. 通过智能合约或交易附加字段将哈希值写入区块链;4. 保存交易ID、区块信息等作为存证凭证;5. 验证时重新计算文件哈希并与链上值比对,一致则未被篡改。 如果您需要将HTML5文件进行区块链存证,确…

    2025年12月23日
    000
  • htm算法 前景如何_分析HTM算法应用前景

    HTM算法在实时异常检测、预测性维护等时序数据场景中具备应用价值,其无需大量标注数据的特性适合工业监控、网络安防等领域;但受限于生态薄弱、性能不及主流模型及工程实现难度,短期内难以成为主流,更可能作为边缘计算或AI系统补充技术,在特定专业领域持续发展。 HTM(Hierarchical Tempor…

    2025年12月23日
    000
  • 如何选取完美的网页配色?色彩理论在HTML中的应用

    选对网页配色能提升用户体验与行为引导。基于色轮的互补、类似、三角色和单色系方案可构建视觉层次,结合色彩情感(如蓝表信任、红表紧迫)传递品牌调性;通过HTML+CSS使用十六进制、RGB或HSL定义颜色,利用CSS变量统一管理,并确保文本与背景高对比度以满足可读性和WCAG标准;借助Adobe Col…

    2025年12月22日
    000
  • 什么是JavaScript BigInt_它如何表示大整数

    JavaScript BigInt 是一种内置原始类型,用于表示任意精度整数,突破 Number 的安全整数限制(2⁵³−1);通过字面量(如123n)或 BigInt() 函数创建,支持基本算术运算但不与 Number 混用,适用于大ID、密码学等高精度场景。 JavaScript BigInt …

    2025年12月21日
    000
  • javascript中的BigInt是什么_它解决了什么问题

    BigInt 是 JavaScript 中用于精确表示任意精度整数的原始类型,解决 Number 类型在超过 2⁵³−1 后的精度丢失问题;需用后缀 n 或 BigInt() 创建,不支持小数、Math 方法及与 Number 混合运算,适用于密码学、区块链、高精度时间戳等场景。 BigInt 是 …

    2025年12月21日
    000
  • 如何实现JavaScript数据可视化_Chart.js和D3.js如何选择

    Chart.js适合简单图表、快速上线场景,如后台系统的用户增长曲线和销售占比饼图;D3.js适合高度定制、强交互或数据驱动DOM操作,如关系网络图、地理热力图等。 选Chart.js还是D3.js,关键看需求复杂度和开发资源——简单图表、快速上线,Chart.js更合适;需要高度定制、交互丰富或数…

    2025年12月21日
    000
  • 什么是JavaScript的BigInt类型?

    BigInt 是 JavaScript 中用于精确表示任意精度整数的原始类型,解决 Number 类型超出 9007199254740991 后精度丢失问题;需用后缀 n 或 BigInt() 创建,不支持小数、Math 方法及 JSON 序列化,运算需同类型,ES2020 起支持。 BigInt …

    2025年12月21日
    000
  • 如何用JavaScript实现复杂的数学计算?

    JavaScript应优先用原生Math对象处理基础运算,结合reduce实现自定义统计计算,复杂需求选用mathjs、numeric.js或decimal.js等专业库,并注意浮点误差与类型校验。 JavaScript本身支持基础数学运算,但处理复杂数学计算(如矩阵运算、微积分、统计分析、高精度数…

    2025年12月21日
    000
  • 使用CSS Grid布局实现复选框多列水平对齐教程

    本教程旨在解决复选框在多列布局中,特别是数量较少时出现对齐不协调的问题。通过详细讲解CSS Grid布局的核心概念和应用,我们将展示如何利用`display: grid`和`grid-template-columns`属性,实现复选框的灵活、响应式且视觉统一的四列水平对齐,避免传统`inline-t…

    2025年12月21日
    000
  • 数字精度问题解决方案_避免浮点数计算误差

    0.1 + 0.2 不等于精确 0.3 是因二进制浮点精度限制,解决方法包括:使用 Decimal 模块实现高精度计算,如 Python 中 Decimal(‘0.1’) + Decimal(‘0.2’) 得 Decimal(‘0.3&#8…

    2025年12月21日
    000
  • JavaScript数字运算精度_javascript数学计算

    JavaScript数字运算精度问题源于IEEE 754双精度浮点数表示法,导致0.1+0.2≠0.3等现象,解决方案包括:1. 使用toFixed()格式化并转回数字;2. 采用放大缩小法进行整数运算;3. 引入decimal.js、big.js等高精度库;4. 比较时设定误差范围epsilon判…

    2025年12月21日
    000
  • JavaScript基础计算器中小数点输入与计算的优化实践

    本教程旨在解决javascript基础计算器应用中,小数点输入后消失或导致计算错误的问题。通过优化数字和运算符的输入处理逻辑,确保小数点能够正确显示和参与计算,避免将2.5错误地解析为25。核心策略在于精确管理显示字段的字符串值与内部数值变量的转换时机,从而实现稳定可靠的小数点运算功能。 1. 问题…

    2025年12月21日
    000
  • JavaScript中的BigInt类型处理大整数_js ES2020

    BigInt 是 ES2020 引入的用于安全表示超大整数的数据类型,解决 Number 类型在超过 2^53 – 1 后精度丢失的问题;可通过在整数后加 n 或调用 BigInt() 函数创建;支持与自身类型的数学运算,不兼容 number 类型混合计算;与 number 比较时需注意…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信