如何合并两个Python DataFrame?保留原表信息并更新重复项
用第二个DataFrame更新补充基准DataFrame的最优方案
需求明确:保留基准DataFrame(df_1)的原有未重复记录,用第二个DataFrame(df_2)的信息覆盖重复Name对应的字段值,同时添加df_2中新增的Name记录。
步骤1:修正并创建DataFrame
你提供的字典中名字未加引号,这会导致运行错误,需修正为字符串格式:
import pandas as pd df_1 = pd.DataFrame({ "Name": ["Tom", "Daniel", "Anne", "Isabel"], "Age": [50, 40, 45, 25], "Height": [170, 180, 190, 200] }) df_2 = pd.DataFrame({ "Name": ["Tom", "Daniel", "Mike"], "Age": [55, 70, 80], "Height": [210, 190, 160] })
最优方案:使用combine_first方法
这个方法专门用于实现“用一个DataFrame的非空值补充/更新另一个DataFrame”的需求,逻辑最清晰:
# 将Name设为索引,实现按姓名匹配 df1_indexed = df_1.set_index('Name') df2_indexed = df_2.set_index('Name') # 优先使用df2的字段值,df2没有的记录则保留df1的内容 df3_indexed = df2_indexed.combine_first(df1_indexed) # 重置索引,恢复Name为普通列 df_3 = df3_indexed.reset_index() # 可选:保持原df1的记录顺序,新增记录放在末尾 original_names = df_1['Name'].tolist() df_3 = df_3.loc[df_3['Name'].isin(original_names)].append(df_3.loc[~df_3['Name'].isin(original_names)]) df_3 = df_3.reset_index(drop=True)
执行后得到的df_3完全符合预期:
Name Age Height 0 Tom 55 210 1 Daniel 70 190 2 Anne 45 190 3 Isabel 25 200 4 Mike 80 160
备选方案:合并后去重
如果偏好更直观的合并逻辑,也可以用concat+drop_duplicates实现:
# 将df2放在前面合并,确保去重时保留df2的更新值 combined = pd.concat([df_2, df_1]) # 按Name去重,保留第一个出现的记录(即df2的内容) df_3 = combined.drop_duplicates(subset='Name', keep='first') # 同样可选:调整顺序匹配预期 original_names = df_1['Name'].tolist() new_names = [name for name in combined['Name'].unique() if name not in original_names] df_3 = df_3.loc[original_names + new_names].reset_index(drop=True)
方案对比
combine_first:语义更贴合需求,无需关注合并顺序,代码可读性更高,是最优选择。- 合并去重:逻辑更易理解,但需要注意合并顺序和去重参数,适合快速验证场景。
内容的提问来源于stack exchange,提问作者danielssl
相关产品推荐
相关产品推荐

