左连接-使用R/python实现两个数据的左连接

2023-11-09  本文已影响0人  一车小面包人

背景:使用R或者python实现两个数据集的左连接,以此完成部分生信需求。

import pandas as pd #'导入pandas库
data_1=pd.DataFrame({"Name":["chenxiangzhi","lianghui","wangling"],"age":[26,26,25]})
data_2=pd.DataFrame({"Name":["chenxiangzhi","lianghui","chenweiman"],"work":["yes","yes","yes"]})
dataframe.png

观察这两个数据框,它们有这样一些特征:
1.共有列名Name
2.共有列Name中部分值相同,都有 chengxiangzhilianghui,但数据data_1中的wanglingdata_2没有的;数据data_2中的chenweimandata_1没有的
3.除了共有列名Name外,每个数据表有自己独有的列名

某位老师就说过,这样的两个表单存在于一些常见的场景中,例如:
学校的管理系统中,语文课的成绩表单和数学课的表单如何拼接在一起?选修这两门课的学生名字部分重合,即一部分学生两门课都上,但有一些学生只上了语文课或者只上了数学课,那么反映在表单上,两个成绩表上学生的名字列只有部分相同,另一部分是不同的,除此外,一个表单反映的是语文成绩,而另一个表单则是数学成绩。

data_outer=pd.merge(data_1,data_2,how="outer")
data_outer
data_inner=pd.merge(data_1,data_2,how="inner")
data_inner
data_left=pd.merge(data_1,data_2,how="left")
data_left
data_right=pd.merge(data_1,data_2,how="right")
pd_merge.png

外连接能够将共有列的所有值拼接在一起,而没有的值会被赋值为NaN;
内连接只将共有列都有的值拼接在一起;
左连接只将共有列中左边表单的值拼接在一起;
右连接则是将共有列中右边表单的值拼接在一起。

library(dplyr)
data_1<-data.frame(Name=c("chengxiangzhi","lianghui","wangling"),age=c(26,26,25))
data_2<-data.frame(Name=c("chengxiangzhi","lianghui","chenweiman"),work=c("yes","yes","yes"))
data.frame.png
数据格式和之前一样,共有列为Name
dplyr.png
data_1$work<-data_2[match(data_1$Name,data_2$Name),"work"]
data_1
match.png
match(a,b)的主要作用是返回向量a在向量b中的位置,在上图数据框data_2中:
data_2[match(data_1$Name,data_2$Name),]返回data_1中Name列在data_2中Name列的位置,并且在行的位置对数据框进行排序
data_2[match(data_1$Name,data_2$Name),"work"]提取排序后data_2中的work列
data_1$work<-data_2[match(data_1$Name,data_2$Name),"work"]将提取出来的列赋值给data_1的work列

match函数结合数据框的方法实现左连接的效果,但却比左连接更加灵活,它不需要两个数据框中共有列的列名一致,甚至可以一个是数据框的列而另一个是数据框的行名,都能实现匹配。

上一篇 下一篇

猜你喜欢

热点阅读