PySpark多列关联Anti-join:不同ID列的数据帧过滤方案
Pandas实现跨列名多字段Anti-Join过滤
针对你需要从df1中过滤掉存在于df中的记录(基于不同列名的多字段关联),可以用Pandas的merge方法结合indicator参数快速实现,这是最简洁的Anti-join方式之一:
步骤说明
- 通过
merge进行左连接,指定左右表的关联字段映射(left_on对应df1的列,right_on对应df的列) - 利用
indicator=True生成标记列,区分记录来源 - 筛选仅存在于左表(df1)的记录,清理无关列并调整列名
代码实现
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({ 'user_id': [1, 2, 3], 'name': ['AAA', 'ABC', 'XYZ'] }) df = pd.DataFrame({ 'id': [1, 2], 'name': ['AAA', 'ABC'] }) # 执行Anti-join result = df1.merge( df, left_on=['user_id', 'name'], # df1的关联字段 right_on=['id', 'name'], # df的关联字段 how='left', indicator=True ).query('_merge == "left_only"').drop(columns=['_merge', 'id']).rename(columns={'user_id': 'id'}) print(result)
输出结果
id name 2 3 XYZ
链式调用简化写法
如果偏好更紧凑的代码,可以合并步骤:
result = ( df1.merge(df, left_on=['user_id', 'name'], right_on=['id', 'name'], how='left', indicator=True) .loc[lambda x: x['_merge'] == 'left_only', ['user_id', 'name']] .rename(columns={'user_id': 'id'}) )
内容的提问来源于stack exchange,提问作者Datamaniac
相关产品推荐
相关产品推荐

