基于Pandas生成列c:连续1序列结束后保留最大值至更大值出现
解决方案
1. 生成列b的简洁方法
按照规则,当df.a > df.a.shift(1)时b为1,否则为0,直接用pandas内置方法实现:
df['b'] = df['a'].gt(df['a'].shift()).astype(int).fillna(1).astype(int)
说明:gt方法返回布尔值,转int后得到0/1;第一行因shift()后为NaN,用fillna(1)填充(匹配示例中第一行b=1的结果),最后转int确保类型统一。
2. 生成列c的实现逻辑
根据需求,我们需要保留连续1序列的最大值,并填充到下一个更大值出现前的所有行。可以通过以下简洁代码实现:
df['c'] = df['a'].where(df['b'] == 1).cummax().ffill()
分步解释:
df['a'].where(df['b'] == 1):仅保留b=1时的a值,其余位置设为NaNcummax():计算累计最大值,确保每个阶段的峰值不会被后续更小值覆盖ffill():向前填充NaN,将峰值填充到后续所有行,直到下一个更大峰值出现
完整可运行代码
import pandas as pd df = pd.DataFrame( { 'a': [110, 115, 112, 180, 150, 175, 160, 145, 200, 205, 208, 203, 206, 207, 208, 209, 210, 215], } ) # 生成列b df['b'] = df['a'].gt(df['a'].shift()).astype(int).fillna(1).astype(int) # 生成列c df['c'] = df['a'].where(df['b'] == 1).cummax().ffill() print(df)
运行后输出与示例完全一致。
内容的提问来源于stack exchange,提问作者AmirX
相关产品推荐
相关产品推荐

