学习笔记之第十一章 多表拼接(十一)

第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 连接方式

  • 用参数how来指明具体的连接方式
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	纬来	二班
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值