如何在Pandas DataFrame中筛选连续3次超过阈值的数据
解决连续3次超过阈值的残差数据筛选问题
嘿,我懂你的需求——不光要筛出残差≥3的行,还得确保这些行是时间上连续的至少3次,对吧?之前的df[df.residual_value >=3]只能拿到所有超阈值的行,但没法区分是不是连续的。下面给你两种实用的pandas解决方案,看哪种更贴合你的场景:
方法一:保留所有连续≥3次的完整区块(推荐)
这种方法会把一整段连续超阈值的行都保留下来,哪怕这段连续次数超过3次(比如连续4次的话,4行都会被保留)。
步骤分解:
- 先确保数据按时间排序(这一步绝对关键!不然连续判断会完全出错):
df = df.sort_values('timestamp') # 把这里的'timestamp'替换成你实际的时间列名,比如'datetime'
- 标记出所有超阈值的行:
df['is_above'] = df['residual_value'] >= 3
- 给连续的超阈值行分组:
通过比较当前行和上一行的is_above值,不一样就生成新的组ID,这样连续的相同状态会被分到同一个组里:
df['consec_group'] = (df['is_above'] != df['is_above'].shift(1)).cumsum()
- 筛选出长度≥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]
举个例子帮你理解:
假设你的数据是这样的:
| timestamp | residual_value |
|---|---|
| 09:00 | 2 |
| 09:01 | 4 |
| 09:02 | 3 |
| 09:03 | 5 |
| 09:04 | 2 |
| 09:05 | 3 |
| 09:06 | 3 |
用方法一的话,会保留09:01、09:02、09:03这三行(连续3次超阈值);用方法二的话,只有09:03这一行会被标记为has_consec_3=True。
根据你的实际需求选就行啦!
内容的提问来源于stack exchange,提问作者519M4
相关产品推荐
相关产品推荐

