
本文介绍如何使用 Pandas 将两个含共同标识列(如 id)的 DataFrame 沿列方向水平合并,保留所有唯一 ID(即并集),缺失位置自动填充 NaN,并为来源列添加前缀以避免重名。
本文介绍如何使用 pandas 将两个含共同标识列(如 `id`)的 dataframe 沿列方向水平合并,保留所有唯一 id(即并集),缺失位置自动填充 nan,并为来源列添加前缀以避免重名。
在数据整合场景中,常需将多个结构相似但记录不完全重叠的表格按主键(如 id)对齐合并——目标不是传统意义上的“连接”(join),而是以键的并集为索引、左右拼接字段,缺失值用 NaN 填充。Pandas 中最简洁高效的方式是:重命名列 → 设置索引 → 水平拼接(pd.concat(..., axis=1))。
以下是完整实现步骤:
✅ 步骤详解
为各 DataFrame 列添加来源前缀(避免列名冲突)
使用列表推导式批量重命名,例如 df1.columns = [f"df1_{col}" for col in df1.columns]。将公共键列设为索引
调用 .set_index("df1_id") 和 .set_index("df2_id"),使 id 成为行索引,便于后续对齐。沿列方向拼接(axis=1)
pd.concat([df1_idx, df2_idx], axis=1) 自动基于索引(即 id 值)对齐行,未匹配的索引位置补 NaN,完美实现“并集对齐”。
import pandas as pd
# 构造示例数据(注意:实际数据中 id 可能不连续或无序)
df1 = pd.DataFrame({"id": [1, 2, 4], "name": ["a", "b", "c"], "val": [23, 90, 72]})
df2 = pd.DataFrame({"id": [1, 3, 4], "name": ["d", "e", "f"], "val": [88, 12, 11]})
# 步骤1:添加前缀并设索引
df1_prefixed = df1.add_prefix("df1_").set_index("df1_id")
df2_prefixed = df2.add_prefix("df2_").set_index("df2_id")
# 步骤2:水平拼接(自动按索引对齐,并集索引)
result = pd.concat([df1_prefixed, df2_prefixed], axis=1)
print(result)输出:
df1_name df1_val df2_name df2_val 1 a 23.0 d 88.0 2 b 90.0 NaN NaN 3 NaN NaN e 12.0 4 c 72.0 f 11.0
⚠️ 注意事项
- 索引对齐是核心机制:concat(axis=1) 严格依据索引值匹配行,因此务必确保键列已正确设为索引;
- 若原始 id 含重复值,结果中将出现重复索引,建议提前去重或使用 drop_duplicates() 处理;
- 如需保留原始 id 作为普通列而非索引,可在拼接后调用 reset_index();
- 替代方案(如 merge + outer)虽可行,但需手动处理列重命名与多对一逻辑,代码更冗长且易出错。
该方法简洁、可读性强,是 Pandas 中实现“宽表拼接+键并集对齐”的推荐实践。


















