Python Pandas 多表拼接全解析(新手友好版)
·
一、核心前置操作:数据读取
python
运行
import pandas as pd
# 读取Excel中不同工作表
df1 = pd.read_excel('./data/表连接.xlsx', sheet_name='Sheet1')
df2 = pd.read_excel('./data/表连接.xlsx', sheet_name='Sheet2')
二、横向拼接(merge):按关联键合并列
1. 基础场景:同名列关联(一对一)
当两张表有同名且含义相同的列(如 “学号”)时,可直接合并:
python
运行
# 默认按同名列(学号)合并
newdf = pd.merge(df1, df2)
- 效果:将
df1的 “名次、姓名、学号、成绩” 与df2的 “学号、班级” 按学号拼接,生成包含所有列的新表。 - 适用:学号与学生信息一一对应的场景。
2. 进阶场景:多对一 / 多对多关联
当一个学号对应多条记录(如一个学生有多门成绩)时,merge会自动展开:
python
运行
# 显式指定关联列(推荐,避免歧义)
newdf = pd.merge(df1, df2, on='学号')
- 多对一:一个学号对应多条成绩记录,合并后每条成绩都会带上班级信息。
- 多对多:一个学号在两张表中都有多条记录,合并后会生成笛卡尔积(需谨慎使用)。
3. 特殊场景:列名不同但含义相同
当关联键列名不同(如df1是 “编号”,df2是 “学号”)时,需显式指定:
python
运行
newdf = pd.merge(df1, df2, left_on='编号', right_on='学号')
- 效果:将
df1的 “编号” 与df2的 “学号” 视为同一关联键进行拼接。
4. 索引作为关联键
当关联键是 DataFrame 的索引时,可直接用索引合并:
python
运行
# 将列设为索引
df1 = df1.set_index('编号')
df2 = df2.set_index('学号')
# 按索引合并
newdf = pd.merge(df1, df2, left_index=True, right_index=True)
- 优势:索引查询速度更快,适合大数据量场景。
三、表连接方式(how参数)
merge的how参数决定了数据的保留策略,共 4 种核心方式:
表格
| 连接方式 | 参数值 | 核心逻辑 | 适用场景 |
|---|---|---|---|
| 内连接 | inner | 只保留两张表中都存在的关联键数据 | 取交集,过滤不匹配数据 |
| 左连接 | left | 保留左表(df1)的所有数据,右表(df2)中无匹配的填NaN | 以左表为主,补充右表信息 |
| 右连接 | right | 保留右表(df2)的所有数据,左表(df1)中无匹配的填NaN | 以右表为主,补充左表信息 |
| 外连接 | outer | 保留两张表的所有数据,无匹配的填NaN | 取并集,查看所有数据 |
示例代码
python
运行
# 内连接(默认)
inner_df = pd.merge(df1, df2, on='学号', how='inner')
# 左连接
left_df = pd.merge(df1, df2, on='学号', how='left')
# 右连接
right_df = pd.merge(df1, df2, on='学号', how='right')
# 外连接
outer_df = pd.merge(df1, df2, on='学号', how='outer')
四、处理重复列名
当两张表有同名非关联列时,merge会自动添加后缀区分,也可自定义:
python
运行
# 自定义后缀
newdf = pd.merge(df1, df2, on='学号', how='outer', suffixes=('_L', '_R'))
# 重命名列(可选)
newdf = newdf.rename(columns={'姓名_L': '姓名'})
- 效果:将
df1的 “姓名” 重命名为 “姓名_L”,df2的 “姓名” 重命名为 “姓名_R”,避免混淆。
五、纵向拼接(concat):按行合并
当两张表列名完全相同,需要将数据上下堆叠时,使用concat:
python
运行
# 纵向拼接,忽略原索引
newdf = pd.concat([df1, df2], ignore_index=True)
- 效果:将
df2的行追加到df1下方,生成行数更多的新表。 - 注意:列名必须一致,否则会产生大量
NaN。
六、核心总结(新手必记)
- 横向拼接(merge):按关联键合并列,核心是
on/left_on/right_on指定关联关系,how指定数据保留策略。 - 纵向拼接(concat):按行合并,核心是列名一致,
ignore_index=True重置索引。 - 函数选择技巧:需要按关联键整合不同维度信息用
merge,需要堆叠相同结构数据用concat。
更多推荐



所有评论(0)