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

从大型DataFrame批量移除ID耗时过长,求高效优化方案

高效过滤DataFrame中匹配交易ID的记录

数据情况

现有两个DataFrame:df1和df2,具体信息如下:

print(df1.shape)
(1042009, 40)

print(df1.columns)
Index(['date_acte', 'transaction_id', 'amount', ...],
      dtype='object')

print(df2.shape)
(734738, 37)

print(df2.columns)
Index(['date', 'transaction_id', 'amount', ...],
      dtype='object')

需求

移除df1中包含df2里唯一transaction_id的记录,保留剩余数据。

当前实现及问题

采用如下代码处理时,生成结果耗时近5小时:

Filtre = list(df2.transaction_id.unique())
print(len(Filtre))
733465

noMatched = df1.loc[
    (~df1['transaction_id'].str.contains('|'.join(Filtre), case=False, na=False))]

高效解决方案

使用isin()方法替代正则匹配,能大幅缩短处理时间:

# 提取df2中唯一的transaction_id,转成集合提升查询效率
unique_trans_ids = set(df2['transaction_id'].unique())
# 过滤df1中不在集合里的记录
noMatched = df1[~df1['transaction_id'].isin(unique_trans_ids)]

为什么更快?

  • isin()是Pandas的向量化操作,底层基于哈希表实现,查询效率远高于字符串正则匹配
  • 集合(set)的成员查询时间复杂度为O(1),比列表(list)的O(n)更高效
  • 避免了拼接超长正则表达式带来的性能损耗和潜在的匹配错误(比如ID中包含特殊正则字符时)

额外优化建议

  • 确保df1['transaction_id']和df2['transaction_id']的类型一致(比如都是字符串),避免类型转换带来的额外开销
  • 如果需要忽略缺失值,可添加参数:~df1['transaction_id'].isin(unique_trans_ids, na=False)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:03:15