第11章 多表拼接
11.1 表的横向拼接
- 表的横向拼接就是在横向将两个表依据公共列拼接在一起。
- 在Excel中实现横向拼接利用的是vlookup()函数,关于vlookup()函数这里就不展开了,相信大家应该都很熟悉。
- 在 Python 中实现横向拼接利用的 merge()方法,接下来的几节主要围绕 merge()方法展开。
11.1.1 连接表的类型
- 连接表的类型关注的就是待连接的两个表都是什么类型,主要有3种情况:一对一、多对一、多对多。
- 一对一
df1 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 1)
df1
名次 姓名 学号 成绩
0 1 小张 100 650
1 2 小王 101 600
2 3 小李 102 578
3 4 小舟 103 550
df2 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 2)
df2
学号 班级
0 100 一班
1 101 一班
2 102 二班
3 103 三班
pd.merge(df1,df2)
名次 姓名 学号 成绩 班级
0 1 小张 100 650 一班
1 2 小王 101 600 一班
2 3 小李 102 578 二班
3 4 小舟 103 550 三班
df1 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 3)
df1
姓名 学号 f_成绩
0 小张 100 650
1 小王 101 600
2 小李 102 578
df2 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 4)
df2
学号 成绩
0 100 568
1 100 609
2 101 697
3 101 702
4 102 645
5 102 676
pd.merge(df1,df2,on = "学号")
姓名 学号 f_成绩 成绩
0 小张 100 650 568
1 小张 100 650 609
2 小王 101 600 697
3 小王 101 600 702
4 小李 102 578 645
5 小李 102 578 676
df1 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 3)
df1
姓名 学号 f_成绩
0 小张 100 650
1 小王 101 600
2 小李 102 578
3 小张 100 774
4 小王 101 658
5 小李 102 855
df2 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 4)
df2
学号 成绩
0 100 568
1 100 609
2 101 697
3 101 702
4 102 645
5 102 676
pd.merge(df1,df2,on = "学号")
姓名 学号 f_成绩 成绩
0 小张 100 650 568
1 小张 100 650 609
2 小张 100 774 568
3 小张 100 774 609
4 小王 101 600 697
5 小王 101 600 702
6 小王 101 658 697
7 小王 101 658 702
8 小李 102 578 645
9 小李 102 578 676
10 小李 102 855 645
11 小李 102 855 676
11.1.2 连接键的类型
- 默认以公共列作为连接键
- 用on来指定连接键
- 公共列可以有多列,也就是连接键可以有多个
- 使用的参数分别是left_on和rigth_on, left_on用来指明左表用作连接键的列名,right_on用来指明右表用作连接键的列名
df1 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 1)
df1
名次 姓名 编号 成绩
0 1 小张 100 650
1 2 小王 101 600
2 3 小李 102 578
3 4 小舟 103 550
df2 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 2)
df2
学号 班级
0 100 一班
1 101 一班
2 102 二班
3 103 三班
pd.merge(df1,df2,left_on = "编号",right_on = "学号")
名次 姓名 编号 成绩 学号 班级
0 1 小张 100 650 100 一班
1 2 小王 101 600 101 一班
2 3 小李 102 578 102 二班
3 4 小舟 103 550 103 三班
- 把索引列当作连接键
- 索引列不算是真正的列,当公共列是索引列时,就要把索引列当作连接键,使用的参数分别是 left_index 和 right_index,left_index 用来控制左表的索引,right_index用来控制右表的索引
11.1.3 连接方式
df1 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 5)
df1
名次 姓名 学号 成绩
0 1 小张 100 650
1 2 小王 101 600
2 3 小李 102 578
3 4 小赵 103 550
df2 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 6)
df2
姓名 学号 班级
0 小张 100 一班
1 小王 101 一班
2 小李 102 二班
3 小钱 104 三班
pd.merge(df1,df2,on = "学号",how = "inner")
名次 姓名_x 学号 成绩 姓名_y 班级
0 1 小张 100 650 小张 一班
1 2 小王 101 600 小王 一班
2 3 小李 102 578 小李 二班
pd.merge(df1,df2,on = "学号",how = "left")
名次 姓名_x 学号 成绩 姓名_y 班级
0 1 小张 100 650 小张 一班
1 2 小王 101 600 小王 一班
2 3 小李 102 578 小李 二班
3 4 小赵 103 550 NaN NaN
pd.merge(df1,df2,on = "学号",how = "right")
名次 姓名_x 学号 成绩 姓名_y 班级
0 1.0 小张 100 650.0 小张 一班
1 2.0 小王 101 600.0 小王 一班
2 3.0 小李 102 578.0 小李 二班
3 NaN NaN 104 NaN 小钱 三班
pd.merge(df1,df2,on = "学号",how = "outer")
名次 姓名_x 学号 成绩 姓名_y 班级
0 1.0 小张 100 650.0 小张 一班
1 2.0 小王 101 600.0 小王 一班
2 3.0 小李 102 578.0 小李 二班
3 4.0 小赵 103 550.0 NaN NaN
4 NaN NaN 104 NaN 小钱 三班
11.1.4 重复列名处理
- 两个表在进行连接时,经常会遇到列名重复的情况。在遇到列名重复时,pd.merge()方法会自动给这些重复列名添加后缀_x、_y或_z,而且会根据表中已有的列名自行调整
- 当然我们也可以自定义重复的列名,只需要修改参数 suffixes的值即可,默认为["_x","_y"]
pd.merge(df1,df2,on = "学号",how = "inner", suffixes=('_R', '_L'))
名次 姓名_R 学号 成绩 姓名_L 班级
0 1 小张 100 650 小张 一班
1 2 小王 101 600 小王 一班
2 3 小李 102 578 小李 二班
11.2 表的纵向拼接
- 在Python中想纵向合并两个表,需要用到concat()方法
11.2.1 普通合并
df1 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 7)
df1
姓名 班级
0 徐丹 一班
1 李旭文 一班
2 程程 一班
3 赵涛 一班
df2 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 8)
df2
姓名 班级
0 赵一 二班
1 李鹏 二班
2 纬来 二班
3 格颜 二班
pd.concat([df1,df2])
姓名 班级
0 徐丹 一班
1 李旭文 一班
2 程程 一班
3 赵涛 一班
0 赵一 二班
1 李鹏 二班
2 纬来 二班
3 格颜 二班
11.2.2 索引设置
- 我们可以通过设置参数ignore_index的值,让其等于True,这样就会生成一组新的索引,而不保留原表的索引
pd.concat([df1,df2],ignore_index = True)
姓名 班级
0 徐丹 一班
1 李旭文 一班
2 程程 一班
3 赵涛 一班
4 赵一 二班
5 李鹏 二班
6 纬来 二班
7 格颜 二班
11.2.3 重叠数据合并
df1 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 7)
df1
姓名 班级
0 徐丹 一班
1 李旭文 一班
2 程程 一班
3 赵涛 一班
4 格颜 二班
df2 = pd.read_excel(r"D:\PythonFlie\test_3.xlsx",header=0,sheet_name = 8)
df2
姓名 班级
0 赵一 二班
1 李鹏 二班
2 纬来 二班
3 格颜 二班
pd.concat([df1,df2])
姓名 班级
0 徐丹 一班
1 李旭文 一班
2 程程 一班
3 赵涛 一班
4 格颜 二班
0 赵一 二班
1 李鹏 二班
2 纬来 二班
3 格颜 二班
pd.concat([df1,df2]).drop_duplicates()
姓名 班级
0 徐丹 一班
1 李旭文 一班
2 程程 一班
3 赵涛 一班
4 格颜 二班
0 赵一 二班
1 李鹏 二班
2 纬来 二班