PySpark合并两个DataFrame并保留唯一值的实现方案
合并两个DataFrame保留指定记录的解决方案
方法一:拼接后去重(简洁直观)
这种方式先将两个DataFrame纵向拼接,再基于唯一标识列去重,保留第一次出现的记录(也就是questions_version1中的共有记录):
import pandas as pd # 拼接两个DataFrame combined = pd.concat([questions_version1, questions_version2]) # 根据question、answer、version组合去重,保留首次出现的记录 merged_df = combined.drop_duplicates(subset=['question', 'answer', 'version'], keep='first') # 按question排序,与目标结果格式对齐 merged_df = merged_df.sort_values('question').reset_index(drop=True)
原理:concat把两个表的行合在一起,drop_duplicates指定三个列作为判断重复的依据,keep='first'确保优先保留questions_version1里的记录(因为它在拼接时排在前面),自动过滤掉questions_version2中重复的行,同时保留questions_version2独有的行。
方法二:先筛选独有记录再合并(高效适合大数据)
如果数据量较大,先筛选出questions_version2中独有的记录,再和questions_version1合并,能减少不必要的计算:
import pandas as pd # 生成两个DataFrame的唯一标识索引 v1_index = questions_version1.set_index(['question', 'answer', 'version']).index v2_index = questions_version2.set_index(['question', 'answer', 'version']).index # 筛选questions_version2中不在questions_version1里的记录 v2_unique = questions_version2[v2_index.difference(v1_index)] # 合并questions_version1和v2_unique merged_df = pd.concat([questions_version1, v2_unique]).sort_values('question').reset_index(drop=True)
原理:通过索引对比,精准提取questions_version2中没有出现在questions_version1的行,再和原表合并,避免了拼接全表的开销,结果和方法一完全一致。
内容的提问来源于stack exchange,提问作者Marcos Dias
相关产品推荐
相关产品推荐

