如何对比两个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
相关产品推荐
相关产品推荐

