12. Pandas 数据合并与拼接(concat 与 merge)

Pandas 数据合并与拼接(concat 与 merge)

在数据分析中,常常需要将来自不同来源或不同维度的数据整合在一起。Pandas 提供了两种强大的数据合并工具:concatmerge。前者更适合在行或列方向上拼接 DataFrame,而后者则更接近 SQL 的表连接操作,支持多键匹配与多种连接方式。掌握它们的使用方法,是进行数据清洗与整合分析的关键步骤。


1. 使用 concat 拼接数据

concat 用于沿指定轴将多个 DataFrame 拼接起来。默认按行(axis=0)拼接,也可以按列(axis=1)拼接。

python 复制代码
import pandas as pd

df1 = pd.DataFrame({
    "姓名": ["张三", "李四"],
    "城市": ["北京", "上海"]
})

df2 = pd.DataFrame({
    "姓名": ["王五", "赵六"],
    "城市": ["广州", "深圳"]
})

1.1 行拼接

当两个 DataFrame 拥有相同的列结构时,可以直接按行堆叠:

python 复制代码
# 行拼接
df_row = pd.concat([df1, df2], axis=0)
print("按行拼接:\n", df_row)
txt 复制代码
按行拼接:
    姓名  城市
0  张三  北京
1  李四  上海
0  王五  广州
1  赵六  深圳

1.2 列拼接

如果要将不同列的数据拼在一起(例如补充信息列),可以按列方向拼接:

python 复制代码
df3 = pd.DataFrame({
    "销售额": [100, 150],
    "年龄": [23, 34]
})

# 按列拼接
df_col = pd.concat([df1, df3], axis=1)
print("按列拼接:\n", df_col)
txt 复制代码
按列拼接:
    姓名  城市  销售额  年龄
0  张三  北京  100  23
1  李四  上海  150  34

1.3 重置索引

默认会保留原索引,如果希望生成新的连续索引,可以设置 ignore_index=True

python 复制代码
df_row_reset = pd.concat([df1, df2], axis=0, ignore_index=True)
print("重置索引:\n", df_row_reset)
txt 复制代码
重置索引:
    姓名  城市
0  张三  北京
1  李四  上海
2  王五  广州
3  赵六  深圳

2. 使用 merge 合并表

merge 的功能更强大,类似于 SQL 的 JOIN 操作。它允许根据一个或多个键,将不同表的数据进行行级匹配。下面通过示例展示几种常见的连接方式。

python 复制代码
df_left = pd.DataFrame({
    "姓名": ["张三", "李四", "王五"],
    "城市": ["北京", "上海", "广州"]
})

df_right = pd.DataFrame({
    "姓名": ["张三", "李四", "赵六"],
    "销售额": [100, 150, 130]
})

2.1 内连接(默认)

默认方式为内连接,即仅保留两表中键值同时存在的行:

python 复制代码
df_inner = pd.merge(df_left, df_right, on="姓名", how="inner")
print("内连接:\n", df_inner)
txt 复制代码
内连接:
    姓名  城市  销售额
0  张三  北京  100
1  李四  上海  150

2.2 外连接

外连接会保留两表的所有行,缺失部分用 NaN 填充:

python 复制代码
df_outer = pd.merge(df_left, df_right, on="姓名", how="outer")
print("外连接:\n", df_outer)
txt 复制代码
外连接:
    姓名   城市    销售额
0  张三   北京  100.0
1  李四   上海  150.0
2  王五   广州    NaN
3  赵六  NaN  130.0

2.3 左连接与右连接

左连接保留左表的全部行,右连接则保留右表的全部行。两者在实际数据对齐场景中十分常见。

python 复制代码
# 左连接
df_left_join = pd.merge(df_left, df_right, on="姓名", how="left")

# 右连接
df_right_join = pd.merge(df_left, df_right, on="姓名", how="right")

print("左连接:\n", df_left_join)

print("\n右连接\n", df_right_join)
txt 复制代码
左连接:
    姓名  城市    销售额
0  张三  北京  100.0
1  李四  上海  150.0
2  王五  广州    NaN

右连接
    姓名   城市  销售额
0  张三   北京  100
1  李四   上海  150
2  赵六  NaN  130

3. 多键合并

当匹配条件涉及多个字段时,可以将 on 参数设置为列名列表。例如同时按"姓名"和"城市"进行匹配:

python 复制代码
df_left_multi = pd.DataFrame({
    "姓名": ["张三", "李四", "王五"],
    "城市": ["北京", "上海", "广州"],
    "部门": ["A", "B", "A"]
})

df_right_multi = pd.DataFrame({
    "姓名": ["张三", "李四", "王五"],
    "城市": ["北京", "上海", "北京"],
    "销售额": [100, 150, 200]
})

df_multi_merge = pd.merge(df_left_multi, df_right_multi, on=["姓名", "城市"], how="inner")
print("多键合并:\n", df_multi_merge)
txt 复制代码
多键合并:
    姓名  城市 部门  销售额
0  张三  北京  A  100
1  李四  上海  B  150

在数据清洗与报表整合中,多键合并常用于确保匹配条件更精确,避免仅凭单字段造成误合。


4. 小结

在 Pandas 中,concat 更适合做结构相同数据的简单拼接,无论是行方向堆叠还是列方向扩展,都能快速实现。而 merge 则提供了灵活的按键合并机制,可以实现类似 SQL 的多表关联,是构建复杂数据关系的核心工具。

掌握它们的使用规律与差异,能够让你在数据整合、分析建模及报表生成中更加得心应手。

相关推荐
zxsz_com_cn2 小时前
基于AI的设备健康诊断:工业设备智能运维的破局之钥
运维·人工智能
qianmo20212 小时前
基于gitpage实现网页托管的方式方法
python
William_cl3 小时前
【连载3】MySQL 的 MVCC 机制剖析
数据库·mysql
235163 小时前
【MySQL】MVCC:从核心原理到幻读解决方案
java·数据库·后端·sql·mysql·缓存
松果集3 小时前
【1】数据类型1
python
zym大哥大3 小时前
高并发内存池
服务器·数据库·windows
蔗理苦3 小时前
2025-10-07 Python不基础 19——私有对象
开发语言·python·私有对象
. . . . .3 小时前
数据库迁移migration
数据库
杜子不疼.3 小时前
【Linux】进程的初步探险:基本概念与基本操作
linux·人工智能·ai