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

Pandas两个DataFrame合并新增行、按A列匹配更新字段的方法咨询

Pandas 两表合并需求实现方案

你原先使用pd.merge(df1, df2, on=['A'], how='outer')没有得到预期结果,是因为两表中存在同名的c列,合并后会自动拆分为带后缀的c_x、c_y两列,没有做列合并逻辑所以不符合需求。


原始数据定义

import pandas as pd

df1 = pd.DataFrame({'A': ['foo', 'bar', 'test'], 'b': [1, 2, 3], 'c': [3, 4, 5]})
df2 = pd.DataFrame({'A': ['foo', 'baz'], 'c': [2, 1]})

需求1:仅追加df2中A列不在df1的行,匹配行完全保留df1内容

实现思路:先筛选出df2中A列未在df1中出现的行,再直接和df1拼接即可

# 筛选df2中A列不存在于df1的行
df2_only = df2[~df2['A'].isin(df1['A'])]
# 拼接后重置索引得到结果
res1 = pd.concat([df1, df2_only], ignore_index=True)

输出结果完全符合预期:

A    b  c
0   foo  1.0  3
1   bar  2.0  4
2  test  3.0  5
3   baz  NaN  1

需求2:匹配行用df2的c列更新df1,同时追加df2独有的A列行

实现思路:先外连接两表,再对c列做优先级合并,优先取df2的值,缺失时取df1的值

# 外连接两表,给同名列加后缀区分来源
merged_df = pd.merge(df1, df2, on='A', how='outer', suffixes=('_old', '_new'))
# 优先用df2的c值,df2无值则用df1原有c值
merged_df['c'] = merged_df['c_new'].fillna(merged_df['c_old'])
# 保留需要的列得到结果
res2 = merged_df[['A', 'b', 'c']]

也可以用更简洁的索引对齐写法:

res2 = df2.set_index('A').combine_first(df1.set_index('A')).reset_index()[['A','b','c']]

输出结果完全符合预期:

A    b  c
0   foo  1.0  2
1   bar  2.0  4
2  test  3.0  5
3   baz  NaN  1

内容的提问来源于stack exchange,提问作者Dr.PB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:36:04