如何在Pandas中对比两DataFrame的ID列并删除匹配行?
问题诊断与解决方案
核心问题分析
你的代码有两个关键错误导致拆分后的小DataFrame为空:
- 列名匹配错误:数据集示例里,D2的ID列被误命名为
Age,但代码里却用"ID"索引列,直接导致找不到目标列,筛选逻辑完全失效。 - 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仅保留目标行:
| Name | ID | Country |
|---|---|---|
| charlie | 23100100011930000722 | MEX |
内容的提问来源于stack exchange,提问作者Danielr19
相关产品推荐
相关产品推荐

