Pandas实现DataFrame中cond为True行逐行动态比较赋值gg、dd列
按条件逐行更新gg、dd字段实现方案
仅当cond为True时计算gg和dd的值,初始示例数据如下:
high low cond gg dd 0 19 17 False NaN NaN 1 15 12 False NaN NaN 2 18 13 True 19.0 12.0 3 67 56 False NaN NaN 4 46 33 True 67.0 13.0 5 86 78 True 86.0 33.0 6 31 15 False NaN NaN 7 74 42 True 86.0 15.0 8 53 46 False NaN NaN 9 23 11 True 74.0 11.0
核心计算规则
按行号从小到大顺序遍历数据,仅处理cond取值为True的行,cond为False的行gg、dd字段保留原有NaN值即可:
- 遍历到的第一个
cond=True行作为首个有效基准行,保留其初始赋值的gg、dd值,记录这两个值作为后续比较的基准 - 后续每遇到一个
cond=True的行,先取当前行初始的dd值,和上一个有效基准行的gg值做比较 - 如果当前行初始
dd小于 上一基准行的gg值,直接将当前行的gg、dd替换为上一基准行的对应值,当前行成为新的有效基准行 - 如果当前行初始
dd大于等于上一基准行的gg值,保留当前行初始的gg、dd值,当前行成为新的有效基准行 - 后续所有比较都以最新生成的有效基准行的
gg值为参考基准,重复上述比较、替换、更新基准的流程直到遍历完所有数据
可直接运行的Pandas实现代码
import pandas as pd import numpy as np # 构造初始示例数据 df = pd.DataFrame({ 'high': [19, 15, 18, 67, 46, 86, 31, 74, 53, 23], 'low': [17, 12, 13, 56, 33, 78, 15, 42, 46, 11], 'cond': [False, False, True, False, True, True, False, True, False, True], 'gg': [np.nan, np.nan, 19.0, np.nan, 67.0, 86.0, np.nan, 86.0, np.nan, 74.0], 'dd': [np.nan, np.nan, 12.0, np.nan, 13.0, 33.0, np.nan, 15.0, np.nan, 11.0] }) # 初始化基准值缓存 last_gg = None last_dd = None # 按行遍历 for idx, row in df.iterrows(): # 跳过cond为False的行 if not row['cond']: continue # 第一个有效行直接记录基准值 if last_gg is None: last_gg = row['gg'] last_dd = row['dd'] continue # 比较当前dd和上一个基准gg if row['dd'] < last_gg: # 替换为上一基准行的值 df.loc[idx, 'gg'] = last_gg df.loc[idx, 'dd'] = last_dd # 更新基准值为当前行的最新值 last_gg = df.loc[idx, 'gg'] last_dd = df.loc[idx, 'dd'] # 打印计算结果 print(df)
上述代码完全按照规则逐行迭代,通过缓存最新基准值避免重复回溯历史行,执行效率随数据量线性增长,可直接复用在更大体量的数据集上。
内容的提问来源于stack exchange,提问作者Kael
相关产品推荐
相关产品推荐

