前面两篇,无论是连接表的类型还是连接键的类型,待连接的两个表总是至少都存在一列,它们的内容是相同的。当然,列名不一定相同。如果列名相同,那就是公共列,直接采取连接表即可。若不同,则采用连接键即可。如果说不存在内容的相同的列,这个时候只能采用连接方式了。
表的连接方式有内连接(inner)、外连接(outer,也叫全连接)、左连接(left)、右连接(right)
四种连接方式示意图如下:
连接方式通过how参数进行指定
为了方便叙述,假定要操作的两个表为A和B
本文所用到的两个表格内容如下:
成绩表
学生信息表
先来看一下两个表 的数据情形
import pandas as pd
score_df = pd.read_excel(r'C:\Users\admin\Desktop\成绩表.xlsx')
print(score_df)
result:
学号 姓名 成绩 排名
0 0 小明 90 3
1 1 小刚 89 4
2 2 小红 98 1
3 3 小兰 63 7
4 4 李华 95 2
5 5 张三 23 9
6 6 李四 56 8
7 7 王五 85 5
8 8 小张 72 6
stu_df = pd.read_excel(r'C:\Users\admin\Desktop\学生信息表.xlsx')
print(stu_df)
result:
学号 年级 班级
0 0 三年级 二班
1 1 五年级 三班
2 2 六年级 一班
3 9 六年级 一班
1.内连接(inner)
内连接就是两个表取交集,即A∩B
score_df = pd.read_excel(r'C:\Users\admin\Desktop\成绩表.xlsx')
stu_df = pd.read_excel(r'C:\Users\admin\Desktop\学生信息表.xlsx')
new_df = pd.merge(score_df, stu_df, how='inner')
print(new_df)
result:
学号 姓名 成绩 排名 年级 班级
0 0 小明 90 3 三年级 二班
1 1 小刚 89 4 五年级 三班
2 2 小红 98 1 六年级 一班
结果只显示在学生信息表中的学生对应的成绩,无论是成绩表中的学号为9的记录还是学生信息表中的小兰、李华等人,都没有显示出来。
2.外连接(outer)
内连接就是两个表取并集,即A∪B
score_df = pd.read_excel(r'C:\Users\admin\Desktop\成绩表.xlsx')
stu_df = pd.read_excel(r'C:\Users\admin\Desktop\学生信息表.xlsx')
new_df = pd.merge(score_df, stu_df, how='outer')
print(new_df)
result:
学号 姓名 成绩 排名 年级 班级
0 0 小明 90.0 3.0 三年级 二班
1 1 小刚 89.0 4.0 五年级 三班
2 2 小红 98.0 1.0 六年级 一班
3 3 小兰 63.0 7.0 NaN NaN
4 4 李华 95.0 2.0 NaN NaN
5 5 张三 23.0 9.0 NaN NaN
6 6 李四 56.0 8.0 NaN NaN
7 7 王五 85.0 5.0 NaN NaN
8 8 小张 72.0 6.0 NaN NaN
9 9 NaN NaN NaN 六年级 一班
结果会显示所有学生的信息,即使这些学生没有成绩也会显示(比如小兰、李华等人)。同样地,对于成绩表,即使没有学生与之匹配,也会显示出来(比如学号为9的记录)
3.左连接(left)
左连接就是获取A∪(A∩B)
score_df = pd.read_excel(r'C:\Users\admin\Desktop\成绩表.xlsx')
stu_df = pd.read_excel(r'C:\Users\admin\Desktop\学生信息表.xlsx')
new_df = pd.merge(score_df, stu_df, how='left')
print(new_df)
result:
学号 姓名 成绩 排名 年级 班级
0 0 小明 90 3 三年级 二班
1 1 小刚 89 4 五年级 三班
2 2 小红 98 1 六年级 一班
3 3 小兰 63 7 NaN NaN
4 4 李华 95 2 NaN NaN
5 5 张三 23 9 NaN NaN
6 6 李四 56 8 NaN NaN
7 7 王五 85 5 NaN NaN
8 8 小张 72 6 NaN NaN
结果会显示成绩表的所有数据,无论学生信息表有没有与之匹配的记录都会显示。而学生信息表中学号为9的记录因为没有在成绩表中找到对应的记录,因而不显示
4.右连接(right)
右连接就是获取B∪(A∩B)
score_df = pd.read_excel(r'C:\Users\admin\Desktop\成绩表.xlsx')
stu_df = pd.read_excel(r'C:\Users\admin\Desktop\学生信息表.xlsx')
new_df = pd.merge(score_df, stu_df, how='right')
print(new_df)
result:
学号 姓名 成绩 排名 年级 班级
0 0 小明 90.0 3.0 三年级 二班
1 1 小刚 89.0 4.0 五年级 三班
2 2 小红 98.0 1.0 六年级 一班
3 9 NaN NaN NaN 六年级 一班
结果会显示学生信息表的所有数据,无论成绩表有没有与之匹配的记录都会显示。而成绩表中小兰、李华等人因为没有在学生信息表中找到对应的记录,因而不显示