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

如何基于双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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:50:17