合并两个DataFrame后如何重新排序并执行Upsert操作
数据表合并更新解决方案
模拟示例数据
先给出符合场景的样例表,方便理解处理逻辑:
初始目标表(TargetDF)
import pandas as pd TargetDF = pd.DataFrame({ "id": [1, 2, 3], "s_gp": ["abc", "bcz", "xyz"], "value": [10, 20, 30] })
待合并源表(SourceDF,无id字段)
SourceDF = pd.DataFrame({ "s_gp": ["fjk", "bcz", "dfg"], "value": [40, 25, 50] })
处理步骤
1. 更新已有记录
通过s_gp字段匹配TargetDF里已存在的记录,用SourceDF的最新值覆盖:
# 筛选SourceDF中存在于TargetDF的记录 existing_rows = SourceDF[SourceDF["s_gp"].isin(TargetDF["s_gp"])] # 关联后替换旧值,保留原id TargetDF = TargetDF.merge(existing_rows, on="s_gp", how="left", suffixes=("_old", "")) TargetDF["value"] = TargetDF["value"].fillna(TargetDF["value_old"]) TargetDF.drop(columns=["value_old"], inplace=True)
2. 新增记录并分配递增id
筛选SourceDF里TargetDF没有的新记录,给它们分配比当前最大id大的连续id:
# 筛选SourceDF中的新记录 new_rows = SourceDF[~SourceDF["s_gp"].isin(TargetDF["s_gp"])] # 生成递增id max_existing_id = TargetDF["id"].max() new_rows["id"] = range(max_existing_id + 1, max_existing_id + 1 + len(new_rows))
3. 合并并修正顺序
把新记录合并到TargetDF,再按id排序保证顺序和目标表id逻辑一致:
# 合并新记录 TargetDF = pd.concat([TargetDF, new_rows], ignore_index=True) # 按id排序,确保顺序匹配目标表id规则 TargetDF.sort_values("id", inplace=True) TargetDF.reset_index(drop=True, inplace=True)
最终结果
处理后的TargetDF如下:
id s_gp value 0 1 abc 10 1 2 bcz 25 2 3 xyz 30 3 4 fjk 40 4 5 dfg 50
- 原
bcz记录的value已从20更新为25 - 新增
fjk、dfg记录,id从4开始递增 - 整体按id排序,保证目标表id的一致性
内容的提问来源于stack exchange,提问作者test_ai uk
相关产品推荐
相关产品推荐

