Pandas如何删除指定列值且相邻时间差小于5分钟的DataFrame行
解决方案
你这个需求的核心是按时间顺序遍历,仅保留与上一条已保留记录时间差≥5分钟的首条记录,直接用相邻行做差的方式无法处理连续短间隔的场景,可参考以下实现:
实现代码
import pandas as pd # 先筛选目标类型数据,再按时间字段升序排序,避免原始数据顺序错乱导致计算偏差 df_b = df[df.columntype == 'B'].sort_values('timeframe').reset_index(drop=True) if len(df_b) == 0: result = df_b else: # 首条记录默认保留 keep_flags = [True] last_kept_time = df_b.loc[0, 'timeframe'] # 从第二条记录开始逐行判断 for idx in range(1, len(df_b)): curr_time = df_b.loc[idx, 'timeframe'] if curr_time - last_kept_time >= pd.Timedelta(minutes=5): keep_flags.append(True) last_kept_time = curr_time else: keep_flags.append(False) result = df_b[keep_flags]
逻辑说明
- 拿你提供的样例数据跑这段代码:首条2021-05-19 10:17:00默认保留,后续4条和它的间隔都是1分钟,全部过滤;到2021-05-25 09:49:00时,和上一条保留记录的间隔远大于5分钟,予以保留,后续2条和它的间隔为0、1分钟,全部过滤;最后2021-07-08 10:33:00和上一条保留记录的间隔达标,予以保留,最终输出和你给出的预期结果完全一致。
- 不直接使用
df.timeframe.diff()做判断的原因:该方法仅计算当前行与紧邻上一行的时间差,遇到连续多条短间隔记录时(比如连续6条每条间隔1分钟),会错误保留累计间隔刚好到5分钟的行,不符合你要的按组保留首条的去重逻辑。 - 该实现在十万行级别的数据集上运行没有性能压力,如果是百万级以上的超大数据集,可以替换为向量化写法优化速度,核心判断逻辑不变。
内容的提问来源于stack exchange,提问作者coderuk
相关产品推荐
相关产品推荐

