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

如何在Pandas中对比两DataFrame的ID列并删除匹配行?

问题诊断与解决方案

核心问题分析

你的代码有两个关键错误导致拆分后的小DataFrame为空:

  1. 列名匹配错误:数据集示例里,D2的ID列被误命名为Age,但代码里却用"ID"索引列,直接导致找不到目标列,筛选逻辑完全失效。
  2. ID匹配逻辑错误:dataframe_collection[i]["ID"] == D1 是将Series与整个DataFrame做相等比较,返回布尔矩阵而非用于筛选的布尔Series,这种错误逻辑会把所有行标记为需要删除,最终导致小DataFrame为空。

另外,针对70万条的D1,先将ID转成集合能大幅提升匹配效率,避免不必要的内存开销。

修正后的代码(含笔误修正与逻辑优化)

首先修正D2的列名笔误,再调整匹配逻辑:

import pandas as pd
import math

# 初始化D1
data1 = ['23100100011930000021', '23100100011930000031','23100100011930000061','23100100011930000081','23100100011930000091','23100100011930000101','23100100011930000181']
D1 = pd.DataFrame(data1, columns=['ID'])

# 初始化D2,修正列名(将原错误的Age改为ID)
data2 = [['tom', '23100100011930000021', 'USA'], ['nick', '23100100011930000031', 'DEU'], ['juli', '23100100011930000061', 'USA'], ['charlie', '23100100011930000722', 'MEX']]
D2 = pd.DataFrame(data2, columns=['Name', 'ID', 'Country'])

# 将D1的ID转为集合,提升匹配速度
d1_ids = set(D1['ID'])

times = math.ceil(D2.shape[0]/500)
result_dfs = []

for i in range(times):
    # 拆分小DataFrame
    df_chunk = D2.iloc[i*500 : (i+1)*500]
    # 筛选ID不在D1中的行
    filtered_chunk = df_chunk[~df_chunk['ID'].isin(d1_ids)]
    result_dfs.append(filtered_chunk)

# 合并所有筛选结果
final_D2 = pd.concat(result_dfs, ignore_index=True)
print(final_D2)

更高效的内存优化方案

实际上不需要拆分D2,isin结合集合的矢量化操作内存开销极低,70万条ID的集合仅占用几十MB内存,直接处理更高效:

# 直接矢量化筛选,内存友好且速度更快
d1_ids = set(D1['ID'])
final_D2 = D2[~D2['ID'].isin(d1_ids)].reset_index(drop=True)

验证结果

运行上述代码后,final_D2仅保留目标行:

NameIDCountry
charlie23100100011930000722MEX

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 21:10:48