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 的多表关联,是构建复杂数据关系的核心工具。

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

相关推荐
会飞的架狗师42 分钟前
【MySQL体系】第8篇:MySQL集群架构技术详解
数据库·mysql·架构
yangchanghua1111 小时前
[记录]一个30秒的sql,我是怎么把它改到0.5秒的
数据库·sql·性能优化
fanstuck1 小时前
AI辅助数学建模有哪些优势?
人工智能·数学建模·语言模型·aigc
tao3556671 小时前
【Python刷力扣hot100】42. Trapping Rain Water
开发语言·python·leetcode
一只安1 小时前
从零开发AI(不依赖任何模型)
人工智能·python
2501_938782091 小时前
实战 Python NLP:处理 PDF 文档批量提取文本并进行主题建模
python·自然语言处理·pdf
成长痕迹1 小时前
【Python与Matlab数据分析对比】
python·matlab·数据分析
11年老程序猿在线搬砖1 小时前
如何搭建自己的量化交易平台
大数据·人工智能·python·自动交易·量化交易系统
Elastic 中国社区官方博客2 小时前
Elasticsearch 开放推理 API 增加了对 Google 的 Gemini 模型的支持
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·googlecloud
错把套路当深情2 小时前
Kotlin保留小数位的三种方法
开发语言·python·kotlin