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

如何在Pandas DataFrame中筛选连续3次超过阈值的数据

解决连续3次超过阈值的残差数据筛选问题

嘿,我懂你的需求——不光要筛出残差≥3的行,还得确保这些行是时间上连续的至少3次,对吧?之前的df[df.residual_value >=3]只能拿到所有超阈值的行,但没法区分是不是连续的。下面给你两种实用的pandas解决方案,看哪种更贴合你的场景:

方法一:保留所有连续≥3次的完整区块(推荐)

这种方法会把一整段连续超阈值的行都保留下来,哪怕这段连续次数超过3次(比如连续4次的话,4行都会被保留)。

步骤分解:

  1. 先确保数据按时间排序(这一步绝对关键!不然连续判断会完全出错):
df = df.sort_values('timestamp')  # 把这里的'timestamp'替换成你实际的时间列名,比如'datetime'
  1. 标记出所有超阈值的行:
df['is_above'] = df['residual_value'] >= 3
  1. 给连续的超阈值行分组:
    通过比较当前行和上一行的is_above值,不一样就生成新的组ID,这样连续的相同状态会被分到同一个组里:
df['consec_group'] = (df['is_above'] != df['is_above'].shift(1)).cumsum()
  1. 筛选出长度≥3的组:
    先统计每个组的有效行数,再把对应组的所有行捞出来:
# 统计每个组里超阈值的行数(组里要么全是True要么全是False)
group_counts = df.groupby('consec_group')['is_above'].sum()
# 筛选出行数≥3的组ID
valid_groups = group_counts[group_counts >= 3].index
# 最终结果
result = df[df['consec_group'].isin(valid_groups)]

方法二:标记出存在连续3次超阈值的位置

如果你只需要标记出那些“刚好凑够连续3次”的位置(比如第3次超阈值的那一行),可以用滚动窗口的方法:

# 先排序时间(同样不能忘)
df = df.sort_values('timestamp')
# 用窗口大小为3的滚动判断,是否连续3次都超阈值
df['has_consec_3'] = df['residual_value'].rolling(window=3).apply(lambda x: all(x >= 3), raw=True)
# 筛选出标记为True的行(注意:这里只有连续3次中的第3行、第4行...会被标记)
result = df[df['has_consec_3'] == True]

举个例子帮你理解:

假设你的数据是这样的:

timestampresidual_value
09:002
09:014
09:023
09:035
09:042
09:053
09:063

用方法一的话,会保留09:01、09:02、09:03这三行(连续3次超阈值);用方法二的话,只有09:03这一行会被标记为has_consec_3=True。

根据你的实际需求选就行啦!

内容的提问来源于stack exchange,提问作者519M4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:27:35