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

如何对比两个DataFrame并提取未存在于第二个DataFrame中的ID与名称数据

嘿,这个需求在日常数据清洗里太常见了!我给你分享两种Pandas的实现方式,都是实用派的,你可以根据自己的场景选:

方法一:用isin()筛选(最直观易读)

这应该是最容易上手的方式,核心思路就是先判断df1的ID是否存在于df2中,再取反筛选出目标行:

import pandas as pd

# 先构造个示例数据,方便你跟着跑
df1 = pd.DataFrame({'ID': [1, 2, 3, 4, 5], '名称': ['张三', '李四', '王五', '赵六', '孙七']})
df2 = pd.DataFrame({'ID': [2, 4]})

# 关键一步:筛选出df1中ID不在df2里的记录
df3 = df1[~df1['ID'].isin(df2['ID'])]
print(df3)

运行后你会得到这样的结果:

ID  名称
0   1  张三
2   3  王五
4   5  孙七

这里的~是Pandas里的取反运算符,它会把isin()返回的布尔数组(True/False)反转,从而拿到所有不在df2中的ID对应的行。

方法二:用merge()做反连接(适合大数据集)

如果你的数据集量级比较大,用merge的反连接逻辑效率会更高,而且这种写法和数据库的查询逻辑很像,熟悉SQL的话会特别亲切:

# 同样用刚才的示例数据
df3 = df1.merge(df2, on='ID', how='left', indicator=True)
# 筛选出只有左表(df1)存在的行,然后删掉标记列
df3 = df3[df3['_merge'] == 'left_only'].drop(columns='_merge')
print(df3)

解释下逻辑:

  • how='left'表示保留df1的所有行,匹配df2的行
  • indicator=True会自动生成一个_merge列,标记每一行的匹配状态:left_only(仅df1有)、right_only(仅df2有)、both(两边都有)
  • 最后筛选出left_only的行,再删掉辅助的_merge列,就得到目标结果了

小提醒

如果df2里有重复的ID,建议先对df2的ID去重,避免不必要的判断:

# 先去重再判断
df3 = df1[~df1['ID'].isin(df2['ID'].drop_duplicates())]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:59:06