pandas系列之横向拼接(三)连接方式

912 阅读4分钟

前面两篇,无论是连接表的类型还是连接键的类型,待连接的两个表总是至少都存在一列,它们的内容是相同的。当然,列名不一定相同。如果列名相同,那就是公共列,直接采取连接表即可。若不同,则采用连接键即可。如果说不存在内容的相同的列,这个时候只能采用连接方式了。

表的连接方式有内连接(inner)、外连接(outer,也叫全连接)、左连接(left)、右连接(right)

四种连接方式示意图如下:

20200423151541228.png

连接方式通过how参数进行指定

为了方便叙述,假定要操作的两个表为A和B

本文所用到的两个表格内容如下:

成绩表

image-20210801113736212.png

学生信息表

image-20210801121952841.png

先来看一下两个表 的数据情形

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  六年级  一班

结果会显示学生信息表的所有数据,无论成绩表有没有与之匹配的记录都会显示。而成绩表中小兰、李华等人因为没有在学生信息表中找到对应的记录,因而不显示