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

如何在Pandas中基于ID和DOB过滤DataFrame共同记录(避免合并冗余列)

基于多字段匹配筛选DataFrame交集记录

需要从包含员工信息的数据集(df1)中,筛选出在另一个DataFrame(df2)中同时匹配ID和DOB字段的记录,且不能引入多余列。由于存在重复ID,必须同时用ID(员工编号)和DOB(出生日期)作为匹配依据。

示例数据

import pandas as pd

df1 = pd.DataFrame({"ID": [1, 2, 3, 4, 5], "DOB": ["1987-12-03", "1993-04-05", "2000-01-24", "1995-05-18", "1974-10-10"], "JOB": [6, 7, 8, 9, 10]})
df2 = pd.DataFrame({"ID": [1, 1, 2, 3, 3, 4, 4], "DOB": ["1987-12-03", "1999-06-16", "1993-04-05", "2000-01-24", "1968-11-13", "1995-05-18", "1988-12-12"], "JOB": [6, 11, 7, 8, 12, 9, 13]})

期望输出

ID         DOB  JOB
0   1  1987-12-03    6
1   2  1993-04-05    7
2   3  2000-01-24    8
3   4  1995-05-18    9

解决方案

方法1:最简内连接实现

直接使用merge做内连接,仅传入df2的ID和DOB字段参与匹配,避免引入多余列:

result = pd.merge(df1, df2[["ID", "DOB"]], on=["ID", "DOB"], how="inner")

内连接会自动保留两个DataFrame中同时匹配(ID, DOB)对的行,且只返回df1的所有列,完全符合需求。

方法2:元组集合匹配筛选

将df2的ID和DOB组合成元组集合,用apply结合isin做行筛选:

# 生成df2的匹配元组集合
match_pairs = set(zip(df2["ID"], df2["DOB"]))
# 筛选df1中符合条件的记录
result = df1[df1.apply(lambda row: (row["ID"], row["DOB"]) in match_pairs, axis=1)]

这种方式无需合并操作,直接对df1进行行过滤,适合不需要关联其他字段的场景。

方法3:带标记的左连接筛选

如果需要保留匹配标记以便后续处理,可使用左连接并设置indicator=True,再筛选标记为both的行:

result = df1.merge(df2[["ID", "DOB"]], on=["ID", "DOB"], how="left", indicator=True)
result = result[result["_merge"] == "both"].drop(columns="_merge")

该方法适合需要区分“仅在df1存在”“仅在df2存在”“同时存在”三种情况的场景,完成筛选后删除标记列即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:36:00