You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:54:28