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

PySpark技术问题:判断DataFrame值是否存在于另一DataFrame

问题分析与解决方案

常见错误原因

  • 使用isin时,误传入整个DF2而非DF2['Approved_Grades']列,导致匹配逻辑错误
  • 误用join方法:join默认按索引匹配,若两个DataFrame的索引并非关联字段,会出现匹配失效或结果混乱
  • 合并时未使用左连接,导致未匹配的行被丢弃

正确实现方法

方法1:直接用isin生成标记列(最简洁)

先构造示例数据方便验证:

import pandas as pd

DF1 = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Charlie'],
    'Grade': ['A', 'B', 'C']
})

DF2 = pd.DataFrame({
    'Approved_Grades': ['A', 'C'],
    'Description': ['Excellent', 'Satisfactory']
})

生成Approved列,标记是否为批准等级:

# 核心:用DF1的Grade匹配DF2的Approved_Grades列
DF1['Approved'] = DF1['Grade'].isin(DF2['Approved_Grades'])

# 可选:转成Yes/No字符串格式
DF1['Approved'] = DF1['Approved'].map({True: 'Yes', False: 'No'})

运行后DF1结果:

NameGradeApproved
AliceAYes
BobBNo
CharlieCYes

方法2:用merge替代join(适合需要同时关联Description的场景)

如果需要同时把DF2的Description字段也合并进来,用merge更直观(join更适合索引对齐的场景):

# 先给DF2新增批准标记,再左连接
DF2['Approved'] = 'Yes'
DF1 = DF1.merge(DF2, left_on='Grade', right_on='Approved_Grades', how='left')

# 给未匹配的行填充No,清理多余列
DF1['Approved'] = DF1['Approved'].fillna('No')
DF1 = DF1.drop('Approved_Grades', axis=1)

排查建议

  1. 检查isin的传入值:必须是一维序列(比如DF2['Approved_Grades']),不能是整个DataFrame
  2. 若用join,需先将其中一个DataFrame的索引设为关联字段(比如DF2.set_index('Approved_Grades', inplace=True)),再执行DF1.join(DF2, on='Grade'),但这种方式不如直接用isin或merge直观

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 07:57:45