Pandas合并两DataFrame按GMC匹配后筛选Provider2不在Provider1的记录
Pandas多表匹配筛选缺失值解决方案
错误原因说明
直接使用右连接加不等值判断的逻辑存在缺陷:相同GMC值下两个表的多行数据会生成笛卡尔积,只要存在任意一组Provider1不等于Provider2就会被保留,无法排除「当前Provider2已经在对应GMC的Provider1列表中存在匹配」的情况,因此会产生大量误筛结果。
实现代码
首先导入依赖并构造测试数据:
import pandas as pd import numpy as np # 构造测试用DataFrame df1 = pd.DataFrame({ "GMC1": [1,1,1,2,3,3,3], "Provider1": [100,101,102, np.nan, 104,105,106] }) df2 = pd.DataFrame({ "GMC2": [1,2,3,3,3], "Provider2": [101,100,104,105,107] })
核心实现逻辑
- 先对df1做预处理,按GMC1分组,将每个分组下非空的Provider1转为集合,生成GMC到Provider集合的映射字典,可实现O(1)复杂度的存在性判断
- 遍历df2的每一行,筛选出Provider2不在对应GMC的Provider集合中的行即可
# 生成GMC到Provider集合的映射 gmc_provider_map = df1.dropna(subset=["Provider1"])\ .groupby("GMC1")["Provider1"]\ .apply(set)\ .to_dict() # 筛选符合要求的结果 result = df2[df2.apply( lambda row: row["Provider2"] not in gmc_provider_map.get(row["GMC2"], set()), axis=1 )]
输出结果
运行代码后得到的result输出如下,和预期完全一致:
GMC2 Provider2 1 2 100 4 3 107
内容的提问来源于stack exchange,提问作者SirSnitch
相关产品推荐
相关产品推荐

