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
相关产品推荐
相关产品推荐

