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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:33:04