merge按列值匹配关联数据,concat按索引或位置堆叠数据;前者用于逻辑关联(如用户与订单),后者用于结构拼接(如多日志合并)。

merge 是按列值匹配,concat 是按位置或索引堆叠
根本区别不在“能不能合并”,而在“怎么对齐”。merge 看的是两表中某列的值是否相等(比如 user_id 都是 101 就连上),而 concat 根本不关心内容,只管把数据块头尾相接(axis=0)或左右并排(axis=1),对齐依据是索引位置或索引值本身。
常见错误现象:
- 用
concat去“关联用户和订单”,结果行数爆炸、字段错位——因为没键匹配,只是机械拼接 - 用
merge去“合并三天的日志表”,结果大量 NaN 或丢数据——因为日志表没有公共键,on参数无从下手
什么时候必须用 merge:需要基于业务键做逻辑关联
典型场景就是两张表有明确的主从/归属关系,比如用户表和订单表、商品表和库存表。这时你不是在“堆数据”,而是在“补信息”。
关键参数和注意事项:
-
on参数必须存在且列值类型一致;若左右列名不同,改用left_on和right_on -
how='left'最常用:保留左表全量,右表无匹配则填NaN;但要注意右表重复键会导致左表某行被展开成多行 - 性能影响:大表
merge会触发哈希连接或排序,若没设索引,可能比concat慢一个数量级
什么时候必须用 concat:结构相同、只需物理拼接
典型场景是时间序列追加(如每天导出一份 CSV)、实验结果汇总、或者把多个模型预测结果横向并列对比。它不解决“谁是谁的”,只解决“谁在谁下面/旁边”。
关键参数和易踩坑点:
-
ignore_index=True几乎必加,否则拼完索引重复(比如都是0,1,2),后续loc或分组会出错 -
axis=1拼宽表时,concat默认按索引对齐——如果两个 DataFrame 索引不一致(比如一个是[0,1,2],另一个是['a','b','c']),结果直接变稀疏,大量NaN - 列名冲突不会报错,但会自动加后缀
_x/_y(仅当join='outer'且未指定suffixes)
merge 和 concat 混用的边界场景:比如先 concat 再 merge
真实项目里常遇到复合需求:例如把上周和本周的订单分别读入,再统一关联用户信息。这时候不能一步到位,得拆开做。
正确顺序是:
- 先用
pd.concat([last_week_df, this_week_df], ignore_index=True)合并订单(结构一致,无键) - 再用
pd.merge(orders_combined, users_df, on='user_id', how='left')补充用户字段(有逻辑键) - 反例:试图用
merge直接连两个同构日志表,on无意义,how='outer'会把所有行笛卡尔积式展开
最易被忽略的是索引状态——concat 后若忘记重置或校验索引,紧接着做 merge 可能因索引错位导致静默错连,查起来极难定位。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











