merge用于按列键值匹配连接表,类似sql join;concat用于结构相同的表堆叠拼接,axis=0纵向、axis=1横向。二者混用时需注意索引对齐与键列位置,避免误用索引导致连接错误。

merge 适合按列对齐的表连接,比如用 user_id 关联用户表和订单表
merge 是关系型连接,核心逻辑是“找相同键值,把两表对应行拼一起”,类似 SQL 的 JOIN。它默认按 on 参数指定的列做等值匹配,不匹配的行默认丢弃(how='inner')。
常见错误现象:KeyError: 'user_id' —— 列名在两个 DataFrame 中不一致,或大小写/空格不匹配;MergeError: No common columns to perform merge on —— 没传 on,且左右表没有同名列。
- 必须显式指定
on、left_on/right_on或靠同名列自动推断(不推荐依赖自动推断) - 如果左右表键名不同,用
left_on='uid'+right_on='id',别改原数据列名 -
how='left'保留左表全部行,右表无匹配则补 NaN,这是最常用的安全选项 - 重复键会导致笛卡尔积膨胀,合并前先用
df.groupby('key').size()检查分布
concat 适合堆叠结构相同的表,比如把 12 个月的销售数据纵向拼成一张大表
concat 是“粘贴”操作,不做逻辑匹配,只按 axis 拼接:axis=0(默认)是上下堆,axis=1 是左右并。要求索引或列名对齐方式明确,否则容易错位。
常见错误现象:拼完后数值错行、列名乱序、出现大量 NaN —— 多因索引未对齐或 ignore_index=True 用错时机。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 纵向拼多张月度表时,确认每张表都有相同列顺序,且不含多余索引列;用
ignore_index=True重置行号 - 横向拼时(
axis=1),默认按索引对齐,不是按位置。索引不一致会直接补 NaN,别指望“第一行对第一行” - 如果原始表索引是时间戳但精度不同(如
2023-01-01vs2023-01-01 00:00:00),先用df.index = df.index.floor('D')对齐 - 拼接前用
pd.concat([df1, df2], verify_integrity=True)快速检查重复索引(会报ValueError)
merge 和 concat 混用时,顺序和索引状态决定结果是否可靠
实际流程常是:先用 concat 把同类报表合起来,再用 merge 关联维度表。但 concat 后的索引若没处理,merge 就可能误用索引当连接键。
典型陷阱:df_combined = pd.concat([q1, q2]) 后直接 df_combined.merge(dim_df, on='product_id'),结果却少了几千行 —— 因为 concat 默认保留原索引,而 dim_df 的索引是 0,1,2…,Pandas 自动把 on 解析成了索引对齐。
- 每次
concat后,立刻判断是否需要reset_index(drop=True),尤其后续要 merge - merge 前用
df.index.name和df.columns确认键字段真正在列里,不在索引里 - 宁可显式删索引列:
df.reset_index(drop=True).merge(...),也别赌 Pandas 能猜对你想连哪一列
性能敏感场景下,merge 的 key 类型和排序影响很大
merge 底层用哈希或排序算法,key 列类型和是否有序直接决定速度。object 类型字符串 key 比 int64 慢 3–5 倍;未排序的 datetime key 在 how='outer' 下可能触发全排序。
实测过 200 万行 × 200 万行 merge,从 48 秒降到 6 秒的关键动作就三个。
- 把 string key 转成
category:df['user_id'] = df['user_id'].astype('category') - 小表 key 提前
sort_values,大表不用排;或两边都设sort=False(需确保业务允许无序输出) - 避免在 merge 里实时计算 key,比如
on=df1['a'] + df1['b'],先算好新列再 merge
NaN 在任何等于比较中都是 False,所以含空的 key 列会导致整行丢失,还很难定位。动手前先跑一遍 df['key'].isna().sum()。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










