如何基于双DataFrame的多条件匹配删除df1中的目标行
Pandas多条件删除DataFrame行解决方案
核心思路
先建立df2中timestamp_copy与对应delta_t的映射关系,再遍历df1的每一行,判断其delta_t是否处于匹配timestamp_copy对应的df2的delta_t±0.1范围内,最终保留不符合删除条件的行。
基础实现(适合中小数据量)
考虑到df1行数远多于df2,先将df2转换为字典提升查找效率:
# 构建timestamp_copy到delta_t列表的映射(处理同一时间戳对应多个delta_t的情况) dt_mapping = df2.groupby('timestamp_copy')['delta_t'].apply(list).to_dict() # 定义判断函数:返回True则保留该行 def should_keep(row): current_ts = row['timestamp_copy'] current_dt = row['delta_t'] # 时间戳不在df2中,直接保留 if current_ts not in dt_mapping: return True # 检查是否落在任意一个对应delta_t的±0.1区间内 for dt2 in dt_mapping[current_ts]: if (dt2 - 0.1) < current_dt < (dt2 + 0.1): return False return True # 过滤得到结果 df1_filtered = df1[df1.apply(should_keep, axis=1)]
高效优化方案(适合大数据量)
如果df1数据量极大,apply方法效率较低,可采用merge结合条件判断:
import pandas as pd # 按timestamp_copy合并df1和df2,保留df1所有行 merged_df = df1.merge(df2, on='timestamp_copy', suffixes=('_df1', '_df2'), how='left') # 标记需要删除的行:delta_t_df1在delta_t_df2±0.1范围内,且存在匹配的时间戳 to_remove = merged_df.apply( lambda x: (x['delta_t_df2'] - 0.1) < x['delta_t_df1'] < (x['delta_t_df2'] + 0.1) if pd.notna(x['delta_t_df2']) else False, axis=1 ) # 过滤并恢复df1原始列 df1_filtered = merged_df[~to_remove][df1.columns]
关键注意事项
- 若df2中同一
timestamp_copy对应多个delta_t,只要df1的delta_t落在其中任意一个的±0.1区间内,该行就会被删除 - 代码中列名需与你的实际数据一致,比如补充代码里的
timestamp_copy就是原问题中的Timestamp字段
内容的提问来源于stack exchange,提问作者JR_11
相关产品推荐
相关产品推荐

