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 小时前
Python简单网络爬虫教程
爬虫·python
小和尚同志5 小时前
小黑插图 Skill:从 11.7k star 的 Codex 专属,到 Claude Code 能用的平替
人工智能·aigc
高洁015 小时前
孪生不止在工厂:能源、医疗与农业
人工智能·深度学习·transformer·知识图谱·tornado
2501_933670795 小时前
2026秋招数据分析岗备考路线:SQL、BI、项目与面试题拆解
数据库
外域速览5 小时前
智谱50亿美元押注AI自训练
大数据·人工智能
人工智能培训5 小时前
孪生不止在工厂:能源、医疗与农业
大数据·人工智能
米小虾5 小时前
让模型说"我不知道",比让它答对更难:放弃文本生成能换来什么
人工智能
新新学长搞科研5 小时前
【SPIE出版】2026年人工智能、新材料与新能源国际学术会议(AINMNE 2026)
人工智能·新能源·新材料
野生技术架构师5 小时前
2026 Java 面试全套总结,八股 + 场景 + AI 相关面试考点
java·人工智能·面试
米小虾6 小时前
不写出来的思考:把 Transformer 的层循环起来,是第三条 scaling 轴还是省错了地方?
人工智能