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

PySpark如何获取一个DataFrame中不存在于另一个DataFrame的行

问题分析与正确实现

你尝试的三种方法失效原因如下:

  • 不等值左连接写法:逻辑完全错误,不等值关联会产生笛卡尔积,完全不符合「提取df1独有的行」的需求
  • subtract方法:如果你使用的是Pandas,Pandas的subtract是数值减法运算API,不是行级差集方法;如果你使用的是PySpark,需要保证两个DataFrame的schema(列顺序、数据类型)完全一致才能正常返回差集
  • 布尔索引过滤写法:如果是PySpark,不支持直接用[]加布尔序列做行过滤;如果是Pandas,旧版本需要将df2['customerId']转为列表才能正常匹配

正确实现方案

1. PySpark 场景(优先推荐)

使用专门的left_anti关联,性能最优,大数据量下效率远高于逐行判断:

# 按customerId匹配,取df1中未匹配到df2的行
diff = df1.join(df2, on="customerId", how="left_anti")

如果需要整行所有列完全匹配才排除,使用subtract(需保证两个DataFrame schema完全一致):

diff = df1.subtract(df2)

2. Pandas 场景

方法一:调整isin写法即可生效

diff = df1[~df1['customerId'].isin(df2['customerId'].tolist())]

方法二:用merge实现anti join,适合多列匹配的场景:

diff = df1.merge(df2[["customerId"]], on="customerId", how="left", indicator=True)
diff = diff[diff["_merge"] == "left_only"].drop(columns="_merge")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:12:02