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

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

相关推荐
二哈喇子!4 小时前
MySQL数据更新操作
数据库·sql
二哈喇子!4 小时前
MySQL命令行导入数据库
数据库·sql·mysql·vs code
心动啊1214 小时前
SQLAlchemy 的使用
数据库
jaray4 小时前
PyCharm 2024.3.2 Professional 如何更换 PyPI 镜像源
ide·python·pycharm·pypi 镜像源
Psycho_MrZhang4 小时前
Neo4j Python SDK手册
开发语言·python·neo4j
Quintus五等升4 小时前
深度学习④|分类任务—VGG13
人工智能·经验分享·深度学习·神经网络·学习·机器学习·分类
2501_936146044 小时前
小型机械零件识别与分类--基于YOLO12-A2C2f-DFFN-DYT模型的创新实现
人工智能·分类·数据挖掘
web3.08889994 小时前
1688图片搜索API,相似商品精准推荐
开发语言·python
少云清4 小时前
【性能测试】15_JMeter _JMeter插件安装使用
开发语言·python·jmeter
天天讯通5 小时前
金融邀约实时质检:呼叫监控赋能客服主管
人工智能·金融