Pandas如何满足两列不同行的时序条件生成expected计算列
实现方法
逻辑说明
核心是按cond1的触发位置拆分独立判定区间,逐区间校验条件即可,不需要额外统计区间内行数:
- 每次遇到
cond1=True就开启新的判定区间,用cumsum()为每个区间生成唯一ID - 每个区间内累计
cond2的出现次数,组内向下偏移1行,排除当前行的cond2值,保证cond2确实出现在当前行之前 - 排除还未出现过
cond1的前置无效区间,同时过滤当前行本身是cond2=True的行,符合条件的位置expected赋值为True,其余位置留空
完整代码
import pandas as pd import numpy as np # 输入初始数据 d={'cond1':[False,False,True,False,False,False,False,True,False,False],'cond2':[False,True,False,True,True,False,False,False,True,False]} df = pd.DataFrame(d) # 生成分区间ID df['group_id'] = df['cond1'].cumsum() # 计算每个区间内、当前行之前的cond2累计出现次数 cond2_cum_in_group = df.groupby('group_id')['cond2'].cumsum() df['cond2_cum_shift'] = cond2_cum_in_group.groupby(df['group_id']).shift(1) # 为expected列赋值 df['expected'] = np.where( (df['group_id'] > 0) & (df['cond2_cum_shift'] > 0) & (~df['cond2']), True, pd.NA ) # 清理临时列 df = df.drop(columns=['group_id', 'cond2_cum_shift'])
运行结果
执行代码后得到的结果和期望表完全一致:
cond1 cond2 expected 0 False False <NA> 1 False True <NA> 2 True False <NA> 3 False True <NA> 4 False True <NA> 5 False False True 6 False False True 7 True False <NA> 8 False True <NA> 9 False False True
内容的提问来源于stack exchange,提问作者junyu
相关产品推荐
相关产品推荐

