
本文介绍使用 pd.concat() 沿列方向(axis=1)合并多个 dataframe 的标准方法:先重命名列避免冲突,再以公共键(如 id)为索引对齐,自动实现全外连接效果,生成带层级或前缀的宽表结构。
本文介绍使用 pd.concat() 沿列方向(axis=1)合并多个 dataframe 的标准方法:先重命名列避免冲突,再以公共键(如 id)为索引对齐,自动实现全外连接效果,生成带层级或前缀的宽表结构。
在 Pandas 中,若需将多个 DataFrame 按某公共列(如 id)进行“横向拼接”,且目标是保留所有唯一键值(即类似 SQL 的 FULL OUTER JOIN),不应使用 pd.merge()(它默认按交集对齐),而应采用 pd.concat(..., axis=1) 配合索引对齐 的组合策略。
核心步骤如下:
- 重命名各 DataFrame 的列,添加前缀(如 df1、df2)以避免列名冲突;
- 将公共键列设为索引(如 set_index("id")),使 pandas 能基于索引值自动对齐行;
- 沿列方向拼接:pd.concat([df1_idx, df2_idx], axis=1),Pandas 会自动执行全外连接(union of indices),缺失位置填充 NaN。
以下是完整可运行示例:
import pandas as pd
# 构造原始数据
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 = df1.add_prefix("df1_")
df2 = df2.add_prefix("df2_")
# 步骤2:以 id 列为索引
df1_idx = df1.set_index("df1_id")
df2_idx = df2.set_index("df2_id")
# 步骤3:横向拼接(自动对齐索引)
result = pd.concat([df1_idx, df2_idx], 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,需提前去重或指定 join="outer"(默认即 outer);
- 如需更清晰的列结构,可用 pd.concat(..., keys=["df1", "df2"]) 生成 MultiIndex 列,再通过 result.columns = result.columns.map('_'.join) 扁平化;
- 不推荐直接用 merge 实现此需求——merge 本质是笛卡尔式连接,需多次调用且难以简洁表达全外并集语义。
该方法简洁、高效、可扩展(支持任意多个 DataFrame),是 Pandas 中横向宽表构建的标准实践。











