如何用Pandas统计连续满足A值小于上次COND为True时A值的次数?
解决DataFrame中基于COND标记的连续计数问题
需求说明
对DataFrame的A列每行数据,与上一次COND列值为True时的A值进行比较:
- 若当前A值小于该标记值,计数累加;
- 若当前A值大于或等于该标记值,计数重置为0;
- COND值为True的行,计数固定为0。
输入数据
import pandas as pd A=[28,30,15,25,24,13,31,19,20,11,19,21] COND=[False,True,False,False,False,False,False,False,True,False,False,False] df=pd.DataFrame({'A':A,'COND':COND})
解决方案
通过标记基准值、分组、连续计数重置三个步骤实现需求:
1. 生成最近一次COND为True的A值列
先保留COND为True的行的A值,其余行设为NaN,再向前填充得到每行对应的基准值:
df['last_true_A'] = df['A'].where(df['COND']).ffill()
2. 按COND标记分组
用COND的累计和生成分组键,确保每个COND=True的行作为新分组的起点,避免跨组计数干扰:
df['group'] = df['COND'].cumsum()
3. 计算连续满足条件的计数
先标记每行是否满足A < last_true_A,再对每个分组内的满足状态做累加,一旦不满足就重置计数为0:
# 标记是否满足条件 df['is_less'] = df['A'] < df['last_true_A'] # 分组计算连续计数,不满足时重置为0 df['expected'] = df.groupby('group')['is_less'].apply( lambda x: x.cumsum().where(x, 0) )
4. 清理临时列(可选)
如果不需要中间列,直接删除即可:
df.drop(['last_true_A', 'group', 'is_less'], axis=1, inplace=True)
验证结果
运行上述代码后,输出结果与预期完全一致:
A COND expected 0 28 False 0 1 30 True 0 2 15 False 1 3 25 False 2 4 24 False 3 5 13 False 4 6 31 False 0 7 19 False 0 8 20 True 0 9 11 False 1 10 19 False 2 11 21 False 0
逻辑说明
last_true_A:确保每行都能获取到最近一次COND标记的基准A值;group:将数据分割为独立区间,每个区间从COND=True的行开始,避免不同区间的计数互相影响;- 连续计数:通过
cumsum()累加满足条件的行数,where(x, 0)保证一旦某行不满足条件,后续行的计数从0重新开始。
内容的提问来源于stack exchange,提问作者July
相关产品推荐
相关产品推荐

