基于指定列实现pandas DataFrame差集运算,解决输出不符预期问题
现有代码的核心问题
drop_duplicates的默认判定逻辑是整行所有列完全一致才会被标记为重复,而非按照指定的contact_id、subscription_id两列匹配。因为df2比df1多了extra列,拼接后根本不存在整行完全匹配的两行,去重逻辑完全失效。- 拼接时没有按照业务指定的联合键对齐数据,直接纵向拼接两个列结构不一致的DataFrame,本身就会产生大量无意义的空值列,无法实现“按两列匹配剔除行、关联extra字段”的需求。
- 重复拼接df2的操作,本质是想通过“找两个表的对称差集”实现剔除效果,但没有处理两个表的列结构差异,逻辑和实际业务需求不匹配。
正确实现方案
实现逻辑完全匹配需求:
- 以
contact_id、subscription_id为联合匹配键,对df1做左连接,自动将df2的extra字段关联到对应行,未匹配的位置自动填充NaN - 过滤掉关联成功(即
extra非空)的行,剩余结果就是目标输出
可直接运行的实现代码:
import pandas as pd df1 = pd.DataFrame({ 'contact_id': [1,3,4,5,-1], 'subscription_id': ['AAA', 'ccc', 'ddd', 'eee', 'fff'] }) df2 = pd.DataFrame({ 'contact_id': [1,2,-1], 'subscription_id': ['AAA', 'bbb', 'fff'], 'extra': ['we', 'kl', 'op'] }) # 按联合键左连接,关联extra字段 merged = df1.merge( df2[['contact_id', 'subscription_id', 'extra']], on=['contact_id', 'subscription_id'], how='left' ) # 过滤掉在df2中匹配成功的行 result = merged[merged['extra'].isna()].reset_index(drop=True) print(result)
代码运行输出与期望完全一致:
contact_id subscription_id extra 0 3 ccc NaN 1 4 ddd NaN 2 5 eee NaN
补充说明:若不需要关联
extra字段,仅需按两列剔除匹配行,也可通过联合键的isin取反实现过滤;上述左连接的方式是最贴合需求(保留extra字段、未匹配填充NaN)的最优实现。
内容的提问来源于stack exchange,提问作者Sangram Badi
相关产品推荐
相关产品推荐

