
使用 pd.concat(axis=1) 对重命名列后的 DataFrames 按索引进行外连接,可高效实现横向拼接,并自动对齐所有唯一索引值,缺失位置填充 NaN。
使用 `pd.concat(axis=1)` 对重命名列后的 dataframes 按索引进行外连接,可高效实现横向拼接,并自动对齐所有唯一索引值,缺失位置填充 nan。
在 Pandas 中,若需将多个 DataFrame 水平合并(side-by-side),且目标是覆盖所有出现过的索引(即“索引的并集”),同时保留各自字段、缺失处补 NaN,推荐采用 pd.concat(..., axis=1, join='outer') 方式——这是最简洁、语义最清晰的解决方案。
关键步骤如下:
- 重命名列以避免冲突:为每个 DataFrame 的列添加前缀(如 "df1_"、"df2_"),确保列名唯一;
- 设共同键为索引:将用于对齐的列(如 id)设为索引;
- 水平拼接:调用 pd.concat(..., axis=1),默认 join='outer' 即按索引并集对齐。
✅ 示例代码(修正原始示例中的数据一致性,更贴合提问):
import pandas as pd
# 构造原始数据(严格对应问题中 df1/df2)
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_renamed = df1.add_prefix("df1_").set_index("df1_id")
df2_renamed = df2.add_prefix("df2_").set_index("df2_id")
# 步骤2:水平拼接(outer join on index)
result = pd.concat([df1_renamed, df2_renamed], 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
⚠️ 注意事项:
- axis=1 表示列方向拼接;join='outer'(默认)确保所有索引都被保留,等价于“全外连接”;
- 若需内连接(仅保留共有的 id),可显式指定 join='inner';
- 不建议使用 merge 实现此需求——merge 面向键对齐的行列关联,而本场景本质是索引对齐的宽表拼接,concat 更自然、高效;
- 若原始 id 列含重复值,set_index 会引发警告或错误,此时应先去重或使用 pd.MultiIndex 处理。
该方法结构清晰、性能良好,是 Pandas 中横向整合多源结构化数据的标准实践。











