concat默认按列名严格对齐,缺失列填NaN;用join='outer'保留所有列,ignore_index=True重置行索引,按值匹配应改用merge而非concat。

concat 为什么拼不出想要的列对齐效果
直接用 pd.concat([df1, df2]) 拼两个列名不完全一致的 DataFrame,结果里会出现大量 NaN,不是你漏了数据,是 Pandas 默认按列名严格对齐——缺的列就补空。这不是 bug,是设计行为。
常见错误现象:concat 后列数变多、某几列全空、行索引重复但没合并。
- 用
ignore_index=True重置行索引,避免拼接后索引混乱(尤其当原表索引非 0,1,2… 时) - 列对齐靠
join='outer'(默认)或join='inner':前者保留所有列(缺值填NaN),后者只留共有的列名 - 如果想强制按位置拼(不管列名),得先统一列名或用
keys+axis=1横向拼,但横向拼要小心列名冲突
纵向拼表时如何保留原始索引又不重复
比如 df1 索引是 ['A', 'B'],df2 是 ['C', 'D'],直接 concat 后索引变成 ['A','B','C','D'] —— 这没问题;但如果两者都是 [0,1],默认就会重复,查数据时容易误判。
- 不重置索引:去掉
ignore_index=True,保留原始索引(适合有业务含义的索引) - 用
verify_integrity=True提前报错,避免静默覆盖(比如发现重复索引就抛ValueError: Indexes have overlapping values) - 真要合并相同索引的行(类似 SQL JOIN),别用
concat,改用pd.merge()或join()
横向拼表(axis=1)的三个关键陷阱
pd.concat([df1, df2], axis=1) 看似简单,实际最容易出错:列名冲突、索引不匹配、隐式广播。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 横向拼默认按索引对齐:df1 索引为
[0,2,4],df2 为[0,1,2],结果只有索引0和2的行会被保留,4和1行直接丢弃 - 两表同名列会自动加后缀(
_x/_y)?不会。concat不做重命名,直接覆盖(后者胜出),必须手动改列名再拼 - 想让缺失索引位置填
NaN而不是丢行?加join='outer'(这是 axis=1 时的默认值,但显式写上更安心)
concat vs merge:什么情况不该用 concat
当你脑子里想的是“按 user_id 合并订单表和用户表”,哪怕两表都有 user_id 列,也别硬套 concat。
-
concat是堆叠(stack),不是关联(relate)——它不理解字段语义,只认索引或列位置 - 需要根据某列值对齐行?用
pd.merge(df1, df2, on='user_id'),支持left/right/outer等多种 join 类型 - 想把多个表按同一索引“摞”成宽表,且索引已对齐?
concat(..., axis=1)可以,但务必先reindex()或align()校验索引一致性
最常被忽略的一点:concat 不检查数据类型兼容性。int 列和 str 列强行拼一起,结果列会变成 object,后续数值计算直接报错。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










