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结果:
| Name | Grade | Approved |
|---|---|---|
| Alice | A | Yes |
| Bob | B | No |
| Charlie | C | Yes |
方法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)
排查建议
- 检查
isin的传入值:必须是一维序列(比如DF2['Approved_Grades']),不能是整个DataFrame - 若用
join,需先将其中一个DataFrame的索引设为关联字段(比如DF2.set_index('Approved_Grades', inplace=True)),再执行DF1.join(DF2, on='Grade'),但这种方式不如直接用isin或merge直观
内容的提问来源于stack exchange,提问作者sanju
相关产品推荐
相关产品推荐

