Datawhale-Pandas中文教程[6]

连接

之前学的数据操作都是针对单个DataFrame, 但有时候我们需要把多个表中的数据按照某种连接方式进行整合,这就需要学习关系连接和方向连接

关系型连接

例如学生期末考试各个科目的成绩表按照 姓名 和 班级 连接成总的成绩表
例如对企业员工的各类信息表按照 员工ID号 进行连接汇总
关系连接指把两个表按照某一组列或多组列的元素匹配结果进行连接,这些列被称为键(key),关系连接共有4种形式
在这里插入图片描述

df1 = pd.DataFrame ( { "Key": ["A","B"],"Col1": [20,30] })
df2 = pd.DataFrame ( { "Key": ["B","c"],"Col2": [ "cat", "dog"] })df1.merae (df2,on="Key" , how="left")
# 上图左连接
df1.merge(df2, on="Key", how='left')
# 参数on表示键
# 参数how表示4种连接方式

如果出现了重复的键,那么重复键的连接会采用笛卡尔积的规则。
在这里插入图片描述

列连接

列连接指两侧表的键在DataFrame的列上出现,使用merge()来进行处理。
有时候需要连接的两个表中键的列名可能不一致,这时可以通过left_onright_on来分别指定左键表的列名和右键表的列名

df1 = pd.DataFrame({'df1_name':['San Zhang','Si Li'],
                    'Age':[20,30]})
df2 = pd.DataFrame({'df2_name':['Si Li','Wu Wang'],
                    'Gender':['F','M']})
df1.merge(df2, left_on='df1_name', right_on='df2_name', how='left')
# 就是单纯的左右互连了
# 如果要合并式的连接的话就先改列名吧

如果两个表中的列出现了重复的列名,那么可以通过 suffixes 参数指定。例如合并考试成绩的时候,第一个表记录了语文成绩,第二个是数学成绩

df1 = pd.DataFrame({'Name':['San Zhang'],'Grade':[70]})
df2 = pd.DataFrame({'Name':['San Zhang'],'Grade':[80]})
df1.merge(df2, on='Name', how='left', suffixes=['_Chinese','_Math'])

有时候我们需要用多组键来实现连接,例如合并两个学生信息表时,如果两位同学来自不同的班级,但是姓名相同,这时候可能会产生笛卡尔积。解决这个问题需要指定on参数为多个列使得正确连接

df1 = pd.DataFrame ( { "Name": ["Alice","Bob","Bob","Tom"],
"Class" :[ 1,1,2,2],
"Gender" : [ "Female", "Male","Male", "Male"]})
df2 = pd.DataFrame ( { "Name ": [ "Tim", "Alice","Bob","Bob"],
"class" :[2,1,2,1],
"Grade" : [80,100,95,75]})
df1.merge(df2, on='Name', how='left') 
# 错误的笛卡尔积后的结果
# 默认情况下重复列的后缀为_x和_y
df1.merge(df2, on=['Name', 'Class'], how='left') # 正确的结果

有时候我们不知道左右表键是否是唯一的,在merge()的时候可以使用参数validate,当任意表不符合唯一性条件时报错,终止合并操作

df1.merge(df2, on="Name", how="outer", validate="1 : 1")
# validate可以设置为1:1,1:m,m:1
# 分别代表对左表键的唯一性和右表键的唯一性进行检查

索引连接

索引连接指两侧表的键在索引上出现,可以使用join()来进行处理,省略参数on表示以当前索引为键进行连接。左表和右表存在同名列时,可以使用参数lsuffix和参数rsuffix来指定后缀。

df1 = pd.DataFrame({"Col": [10]}, index=["A"])
df2 = pd.DataFrame({"Col": [10]}, index=["A"])
df1.join(df2, lsuffix="_left", rsuffix="_right")
# Ex6-4
# 待补充

>=pandas1.2.0后,merge()join()支持一种新的连接方式,称为交叉连接,用how=“cross”表示。
交叉连接指将两个DataFrame或序列进行所有列的笛卡儿积的组合,此时不存在键的概念,因此参数on非法。一个n行的 DataFrame和一个m行的 DataFrame进行交叉连接的结果是一个nxm行的 DataFrame。

df1_cross = pd.DataFrame ( { "A":[0,1],"B" :list ( "ab") })
df2 cross = pd.DataFrame ( { "C": [2,3,4],"D":list ( "cde" )} )
df1_cross.join (df2_cross,how="cross")

其他连接

方向连接

方向连接就是把两个或者多个索引相同的表进行横向或者纵向拼接,可以使用concat()函数来实现,横向拼接参数为axis=1,纵向为axis=0

df1 = pd. DataFrame ( { "A":[1,2],"B":[3,4]})
df2 = pd. DataFrame ( { "A": [5,6],,"B":[7,8]})
df3 = pd. DataFrame ( { "C" : [5,6],"D":[7,8]})
pd.concat([df1, df3, df1, df3], axis=1)
# 4个表合并,且合并方向索引对齐
pd.concat([df1, df2], axis=0) # 默认axis=0
# DataFrame和Series的合并都可以用该函数实现
# append()函数也能完成纵向合并,但是不推荐使用

concat()还存在两个重要参数,分别是joinkeys. 参数join 与merge()或join()中的参数 how含义一致,由于在多表中不存在左表和右表的概念,故参数join 仅支持外连接和内连接,在横(纵)向合并时分别代表取行(列)索引元素的并集和取行(列)索引元素的交集。
参数 keys 并非关系连接中的键,而是在横(纵)向合并时新增一层列(行)索引来指代当前列(行)来自哪个表。

: df1 = pd.DataFrame ({ "A":[1,2],"B":[3,4]},index= ["label1","label2"])
df2 = pd.DataFrame ( { "c": [5,6]}, index= [ "label1", "label3"])
df3 = pd.DataFrame ( { "D":[7,8]}, index= [ "label1", "label4"])
pd.concat ( [df1,df2, df3], axis=1, join="inner")
pd.concat([df1, df2, df3], axis=1, join="outer")
pd.concat ( [df1,df2,df3], axis=1,join="outer", keys=[ "table1", "table2", "table3"])

方向连接一般要求连接方向上的索引是一一对应的,位置可以不对齐,但是要一一映射。如果两个表中任意一个有重复索引,concat()函数会报错;但是如果两侧表所有元素的值和位置都一一对应,则能拼接。
assign()函数能把Series加到DataFrame的末列,传入的参数名称为新列名,支持一次拼接多个序列。如果被拼接的Series索引中出现了DataFrame行索引中未出现的元素,拼接结果的相应位置会被设置为缺失值。

比较和组合

compare()能够比较两个DataFrame或者Series的不同之处并将其汇总展示
combine()的作用是对两个表的元素按照给定的规则进行组合,组合规则由一个输入为两个序列的函数给出。

习题

待补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值