pd.concat() 默认 axis=0 纵向合并,横向拼接须显式指定 axis=1;列名重复自动加后缀,索引不匹配易报错,dtype 不一致会导致静默计算错误。
pd.concat() 默认是纵向合并,横向拼接得加
很多人一上来就写
,发现结果是上下堆叠——这不是 bug,是默认行为。pandas 设计上把
(行方向)当作第一优先级,也就是“按索引对齐后纵向追加”。要横着拼(列方向),必须显式写
。
常见错误现象:
,往往就是忘了加
却拿两个行数不同的 DataFrame 强行横向拼——其实 pandas 此时仍在按
解释,试图纵向合并,自然报错。
:按 index 对齐,纵向堆叠(默认,不用写)
:按 index 对齐,横向拼接(必须写)
如果想按列名对齐而非索引对齐,用
或
控制交集/并集逻辑
列名重复时
不报错,但会悄悄加后缀
横向拼接两个都有
列的 DataFrame,默认不会报错或覆盖,而是自动改名为
、
。这在调试时极难察觉,尤其后续做
取值时只拿到第一个,第二个丢了还不知道。
使用场景:合并多个实验结果表,每张表都带
列;或者拼接不同来源的用户基础信息,字段名撞车很常见。
立即学习
“
Python免费学习笔记(深入)
”;
用
参数给每个 DataFrame 打标签,生成 MultiIndex 列,避免重名:
用
配合
给 MultiIndex 列命名,结构更清晰
不想改名?提前重命名列:
对
没用,别白设
这个参数只影响被拼接对象的索引(即
时的新行号),对横向拼接完全无效。有人误以为加了它就能让列名不重复、或让列顺序重排,其实没任何作用,还可能误导自己以为“已经处理过索引问题”。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
性能影响:开启
会强制重建索引,在大表纵向合并时有明显开销;横向拼接时设它纯属冗余计算。
仅适用于
场景
下真正影响对齐的是
和
(后者可提速)
若两表索引不一致又不想补
,用
只保留共有的索引行
拼接前不检查 dtypes,后面
或
就会静默出错
比如
是
,
是
(混了字符串如
),
照样成功,但新 DataFrame 的
列 dtype 变成
。后续调
直接返回空字符串,不是报错,是算了个寂寞。
容易被忽略的地方:这种类型污染不会在拼接时报 warning,也不会在
里一眼看出异常——因为
列看着很正常。
拼接前用
快速核对数值列
对关键列手动转类型:
用
可检测重复列名(但不查 dtype)
最麻烦的不是拼不起来,是拼起来了还跑得通,结果算错了数。
axis=1pd.concat([df1, df2])axis=0axis=1ValueError: Shape mismatch: cannot join on indices with different lengthsaxis=1axis=0axis=0axis=1join='inner'join='outer'pd.concat()'name''name''name.1'df['name']'score'keyspd.concat([df1, df2], axis=1, keys=['v1', 'v2'])nameskeysdf2 = df2.add_prefix('v2_')ignore_index=Trueaxis=1axis=0ignore_index=Trueignore_index=Trueaxis=0axis=1joinsort=FalseNaNjoin='inner'groupbysum()df1['age']int64df2['age']object'N/A'pd.concat()'age'objectdf.age.sum()print(df.dtypes)objectdf.select_dtypes(include=['number']).dtypesdf2['age'] = pd.to_numeric(df2['age'], errors='coerce')verify_integrity=True