Python使用pd.concat合并DataFrame无重复ID缺省值补None的参数设置
实现代码
你需要的是按ID对齐的横向外连接效果,使用pd.concat实现的完整代码如下:
import pandas as pd df1 = pd.DataFrame( { "ID": ["ID0", "ID1", "ID2", "ID3"], "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"], }, ) df2 = pd.DataFrame( { "ID": ["ID0", "ID1", "ID2", "ID4"], "C": ["C0", "C1", "C2", "C4"], "D": ["D0", "D1", "D2", "D4"], }, ) # 核心合并逻辑 result = pd.concat( # 先将两个表的ID设为行索引,用于匹配对齐 [df1.set_index("ID"), df2.set_index("ID")], axis=1, # 沿列方向横向拼接 join="outer" # 保留两个表所有ID,无匹配位置填充缺失值 ).reset_index() # 把ID从索引恢复为普通列 # 可选:将默认的NaN替换为你需要的None result = result.where(result.notna(), None)
运行后输出结果和你要求的完全一致:
ID A B C D 0 ID0 A0 B0 C0 D0 1 ID1 A1 B1 C1 D1 2 ID2 A2 B2 C2 D2 3 ID3 A3 B3 None None 4 ID4 None None C4 D4
pd.concat核心参数说明
axis=1:指定拼接方向为横向,默认值axis=0是纵向堆叠行,完全不符合你的需求join="outer":保留两个输入表的所有索引(也就是所有ID),如果设置为join="inner"只会保留两个表共有的ID,会丢失ID3和ID4
补充说明:这类按指定列匹配的合并场景,其实用
pd.merge写法更简洁,不需要提前设置索引:pd.merge(df1, df2, on="ID", how="outer").where(lambda x: x.notna(), None),最终效果和concat实现完全相同。
内容的提问来源于stack exchange,提问作者Carlos Filipe Novais
相关产品推荐
相关产品推荐

