其他
数据治理 | 实操性强的Pandas数据匹配教程!
目录
一、前言
二、何为数据匹配
三、数据匹配方式
左连接 右连接 内连接 外连接 多个连接字段 连接字段名称不同 四、总结
本文共3901字,预计阅读时间10分钟,感谢阅读!
Part1前言
Part2何为数据匹配
表 A
为学生成绩表:表 B
为学生信息表:表 A
中添加一列学生性别
,已知学号和性别一定是一一对应的,那么就可以利用这种关系,根据两表中的共有的学号
字段来把表 B
中的性别
一列添加到表 A
当中去。这种操作在 Excel 中可以使用 VLOOKUP 系列函数来完成,但是这种函数局限性很大,也不适合用在较大的数据集上。而 Python 和数据库则非常适合做这样的事情。Table A
为左表
,Table B
为右表
;左连接后数据以左表为基准,只保留左表中连接字段原有的数据。Part3数据匹配方式
我们使用以下两张表来演示以上四种数据匹配方式。
成绩表:记录学号为01-10
十位同学成绩的成绩表
信息表:记录学号为06-15
,十位同学基本信息的信息表
# 读取学生成绩表,所有字段读取为字符型
table_score = pd.read_excel('成绩表.xlsx', dtype=str)
# 读取学生信息表,所有字段读取为字符型
table_info = pd.read_excel('信息表.xlsx', dtype=str)
table_score
和 table_info
。1左连接
数据匹配场景 :将信息表中的学生“性别”匹配到成绩表中
(1)使用 SQL
select A.*, B.性别 from -- 选择 A 表所有字段和 B 表“性别”字段
Student.table_score A left join Student.table_info B -- 左连接并分别为表取别名A,B
on A.学号 = B.学号 -- 两表的连接字段,均是学号字段
01-05
的学生信息,所以所得结果中,这几位同学的性别显示为空。(2)使用 Pandas
pd.merge()
和 df.join()
进行数据匹配,由于前者的功能更加全面,所以这里我们只介绍 pd.merge()
方法。pd.merge()
方法的主要参数如下:left:左表 right:右表 how:连接方式,可选参数有left,right,inner,outer。 on:两张表共同的连接字段 left_on:左表中的连接字段 right_on:右表中的连接字段,此参数必须与 left_on 一同使用。
# 信息表中仅需要连接字段“学号”和所需字段“性别”,所以只取两个字段即可
df_left = pd.merge(left=table_score,
right=table_info[['学号','性别']],
how='left',
on='学号')
df_left
2右连接
(1)使用 SQL
select A.语文, B.* from
Student.table_score A right join Student.table_info B
on A.学号 = B.学号
11-15
的学生信息,所以所得结果中,这几位同学的“语文”成绩显示为空。(2)使用 Pandas
# 成绩表中仅需要连接字段“学号”和所需字段“语文”,只取这两个字段
df_right = pd.merge(left=table_score[['学号','语文']],
right=table_info,
how='right',
on='学号')
df_right
3内连接
(1)使用 SQL
select * from
Student.table_score A inner join Student.table_info B
on A.学号 = B.学号
(2)使用 Pandas
df_inner = pd.merge(left=table_score,
right=table_info,
how='inner',
on='学号')
df_inner
suffixes
来控制,但是不能设置空的标记。4外连接
(1)使用 SQL
select * from
Student.table_score A left join Student.table_info B
on A.学号 = B.学号 --左连接结果
union -- 合并
select * from
Student.table_score A right join Student.table_info B
on A.学号 = B.学号 --右连接结果
11-15
的学生成绩,而信息表中没有学号为01-05
的学生信息,所以对应的部分为空。(2)使用 Pandas
df_outer = pd.merge(left=table_score,
right=table_info,
how='outer',
on='学号')
df_outer
01-15
。5多个连接字段
(1)使用 SQL
select A.*, B.性别 from
Student.table_score A left join Student.table_info B
on A.学号 = B.学号 and A.姓名 = B.姓名 --使用 and 连接两个条件
(2)使用 Pandas
df_left = pd.merge(left=table_score,
right=table_info[['学号','姓名','性别']],
how='left',
on=['学号','姓名'])
df_left
6连接字段名称不同
(1)使用 SQL
select A.*, B.性别 from
Student.table_score A left join Student.table_info B
on A.学号 = B.ID -- 注意两个字段名称
(2)使用 Pandas
on
参数,转而使用 left_on
参数和right_on
参数分别代表两张表的连接字段。df_left = pd.merge(left=table_score,
right=table_info[['学号','姓名','性别']],
how='left',
left_on='学号',
right_on='ID')
df_left
Part4总结
我们将在数据治理板块中推出一系列原创推文,帮助读者搭建一个完整的社科研究数据治理软硬件体系。该板块将涉及以下几个模块(点击标题即可跳转至相应合集):
星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!
点击搜索你感兴趣的内容吧
往期推荐
数据Seminar
这里是大数据、分析技术与学术研究的三叉路口
文 | 《社科领域大数据治理实务手册》
欢迎扫描👇二维码添加关注