背景与关键概念
数据框合并的基本概念
在数据分析中,Python DataFrame 的合并是把多张表按行或列整合到一起的操作。常用的两种核心工具是 pd.concat 与 DataFrame.merge,它们分别对应不同的合并思路。
其中,concat 更多用于沿着轴的简单拼接,而 merge 关注“基于键”的连结,像数据库中的 join。了解这两者的行为差异,是实现正确数据拼接的前提。
concat 与 merge 的适用场景
当目标是直接把两张表按相同列数并排或上下拼接时,通常会选用 pd.concat。把数据沿着 axis=0(竖向)或 axis=1(横向)拼接。
当目标是基于一个或多个列的键进行关系连接时,应优先考虑 merge,其行为更贴近数据库的 join 操作。
操作原理与性能要点
内部机制对比
在内部实现上,pd.concat 会把要拼接的对象简单地沿着指定轴堆叠,保留或重建索引,如果设置 ignore_index=True,索引会被重新编号。
相对地,DataFrame.merge 会使用一个或多个键列来对齐记录,默认执行等值连接,并支持多种连接方式(inner、left、right、outer)。
另外,性能与灵活性在两者之间存在权衡,merge 在大数据量和复杂键时可能更慢,但提供了更丰富的控制。
性能与内存注意点
处理大规模数据时,尽量避免频繁的拷贝,并考虑在 合并前后保持列名一致,以减少重复列的产生。
使用 ignore_index、sort、及 indicator 等参数,可以帮助你控制输出和调试合并行为,从而降低内存压力。
实战对比:典型案例代码解读
案例一:沿轴拼接(竖向/横向)
下面的示例展示了如何用 pd.concat 进行竖向拼接,并粘合不同来源的 DataFrame。
import pandas as pd# 两张数据表具有相同列名,沿竖直方向拼接
df1 = pd.DataFrame({'id':[1,2,3], 'val':['a','b','c']})
df2 = pd.DataFrame({'id':[4,5], 'val':['d','e']})# 竖向拼接,索引重新排序
result = pd.concat([df1, df2], axis=0, ignore_index=True)
print(result)
要点:沿轴拼接时,确保列对齐,最常见的是 axis=0;如果列不完全一致,缺失的部分会填充 NaN。
你也可以横向拼接,即把两张表放在同一行的不同列上,示例如下:
# 横向拼接,按列并排
result2 = pd.concat([df1, df2], axis=1)
print(result2)
结果差异:横向拼接会产生一个扩展后的列集合,行数以两边最低数量为准,缺失值会在未对齐的位置出现。
案例二:基于键的合并(merge)
当两张表存在共同的键列时,merge 提供丰富的连接选项,例如内连接、左连接、右连接和外连接。
# 基于 id 列进行内连接
df1 = pd.DataFrame({'id':[1,2,3], 'v1':['a','b','c']})
df2 = pd.DataFrame({'id':[2,3,4], 'v2':['x','y','z']})result = df1.merge(df2, on='id', how='inner')
print(result)
关键点:选择 how 参数(inner、left、right 或 outer)来控制合并结果的包含关系。
若键列不完全对齐,可以使用 merge 的 set_index 或 left_on/right_on 来指定连接条件以获得期望的输出。

案例三:结合使用与混合场景
实际数据处理中,常见先用 concat 组合基础表,再用 merge 对齐细粒度的字段。
# 先拼接再合并的混合场景示例
base = pd.concat([df1, df2], axis=0, ignore_index=True)
extra = pd.DataFrame({'id':[2,3], 'extra':['e1','e2']})
result = base.merge(extra, on='id', how='left')
print(result)
流程要点:先进行结构化拼接,再通过键列进行对齐,能兼顾数据源的完整性与一致性。


