
本文详细探讨了如何在Pandas DataFrame中根据复杂条件创建一列,该列的值为另一列的累积最小值,并在特定条件触发时重置该累积最小值。文章通过一个具体示例,深入解析了利用`groupby`、`cummin`、`shift`、`mask`和`where`等Pandas高级函数实现这一逻辑的向量化解决方案,旨在提供一个清晰、高效且可扩展的教程。
引言
在数据分析和处理中,我们经常需要计算序列的累积最小值(cumulative minimum)。然而,当这个累积最小值需要在特定条件下“重置”时,问题会变得复杂。例如,我们可能需要在一个辅助列的值满足某个条件时,让累积最小值从当前值重新开始计算。本教程将展示一个使用Pandas进行高效向量化操作的解决方案,以应对这种带有条件重置的累积最小值计算场景。
问题描述与初始数据
假设我们有一个Pandas DataFrame,包含两列a和b。我们的目标是创建新列c,其行为类似于列b的累积最小值,但当满足特定条件时,c的值会重置为当前b的值,并且后续的累积最小值计算将从这个重置点开始。
以下是示例DataFrame:
import pandas as pddf = pd.DataFrame( { 'a': [98, 97, 100, 135, 103, 100, 105, 109, 130], 'b': [100, 103, 101, 105, 110, 120, 101, 150, 160] })print("原始DataFrame:")print(df)
期望的输出DataFrame,包含新列c:
a b c0 98 100 1001 97 103 1002 100 101 1003 135 105 1004 103 110 1105 100 120 1106 105 101 1017 109 150 1508 130 160 150
观察列c的生成逻辑:
初始时,c是b的累积最小值。在第4行,c从100变为110。这是因为某些条件被触发,导致c重置为当前b的值(110),并且从这里开始重新计算b的累积最小值。在第7行,c从101变为150。同样,条件再次触发,c重置为当前b的值(150),并从这里重新计算累积最小值。
这种条件重置的逻辑使得直接使用df.b.cummin()变得不可行,因为我们需要在满足特定条件时“打断”并重新开始累积计算。
解决方案详解
为了实现上述复杂的条件重置累积最小值逻辑,我们将采用一个巧妙的向量化方法。这个方法通过构建多个中间布尔条件和累积计算,最终合成出目标列c。
# 步骤1: 导入必要的库 (如果尚未导入)import pandas as pd# 步骤2: 创建初始DataFrame (与问题描述相同)df = pd.DataFrame( { 'a': [98, 97, 100, 135, 103, 100, 105, 109, 130], 'b': [100, 103, 101, 105, 110, 120, 101, 150, 160] })# --- 核心解决方案 ---# 1. 定义第一个分组条件 (m1)# m1 用于识别潜在的“新累积最小值段”的起始点。# 当当前行的 'b' 值小于或等于前一行的 'a' 值时,m1 为 True。# 这表示可能需要开始一个新的累积最小值序列。m1 = df["b"].le(df["a"].shift())# 2. 基于 m1.cumsum() 进行分组累积最小值计算 (cm)# m1.cumsum() 会为每个连续的 False 块(直到第一个 True)分配相同的组ID,# 并在遇到 True 后递增组ID。这样,每个组内部都会独立计算 'b' 的累积最小值。cm = df["b"].groupby(m1.cumsum()).cummin()# 3. 定义第二个筛选条件 (m2)# m2 是一个复合条件,用于最终决定 'c' 列的值应该从 cm 中取,# 还是从一个备用的累积最小值计算中取。# m2 为 True 的情况包括:# a) 当前 '
以上就是Pandas中基于条件重置累积最小值的高效计算方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1382460.html
微信扫一扫
支付宝扫一扫