如何在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
相关产品推荐
相关产品推荐

