Python pandas 带条件合并两个Dataframe的问题咨询
基于指定列匹配覆盖的Pandas DataFrame合并方案
pd.concat仅实现数据的直接堆叠,不会按指定列做行匹配,因此会产生重复的无效行,下述方案通过外连接+值优先级填充的逻辑实现指定规则的合并需求。
核心逻辑
以Source1、Target1、Source2、Target2作为共同匹配主键,优先保留DF2的行数据,未匹配到的DF1行保留原有值,最终输出包含两个表全部列的结果。
完整实现代码
import pandas as pd # 定义匹配主键 match_keys = ["Source1", "Target1", "Source2", "Target2"] # 给两个表非主键列加后缀区分,避免合并重名冲突 df1_suf = DF1.add_suffix("_df1").rename(columns={k+"_df1":k for k in match_keys}) df2_suf = DF2.add_suffix("_df2").rename(columns={k+"_df2":k for k in match_keys}) # 按主键外连接,保留两个表所有行和列 merged = pd.merge(df1_suf, df2_suf, on=match_keys, how="outer") # 遍历所有列,优先取DF2的值,缺失值用DF1的值填充 all_cols = list(set(DF1.columns.tolist() + DF2.columns.tolist())) for col in all_cols: if col in match_keys: continue merged[col] = merged.get(f"{col}_df2", pd.NA).fillna(merged.get(f"{col}_df1", pd.NA)) # 清理辅助列,重置索引得到最终结果 result = merged[all_cols].reset_index(drop=True) print(result)
特性说明
- 外连接规则确保两个表的所有行都不会丢失
- 同名列取值优先级:DF2 > DF1,匹配到的DF1行数据会被DF2的对应值覆盖
- 自动保留DF1和DF2的全部列,单个表独有的列未匹配到的位置会填充空值
内容的提问来源于stack exchange,提问作者densing
相关产品推荐
相关产品推荐

