目录
1.前言
2.参数介绍
参数如下:
3.基础案例
3.1on关键字演示
3.2left_on 和 right_on 关键字
3.3left_index 和 right_index 关键字
3.4数据连接的类型
3.4.1
1.前言
在数据合并操作中,有两个操作函数pd.caoncat()和pd.merge() ,这两个函数在使用过程中经常会拿来比较,只要我们弄懂了其中重要参数的意义,理解每一个函数的用法,就能做到在那种环境适用那个函数,让我们通过本文深入理解pd.merge().
参考链接:https://cloud.tencent.com/developer/article/2070402
2.参数介绍
参数如下:
参数名 | 作用 |
---|---|
left | 拼接的左侧DataFrame对象 |
right | 拼接的右侧DataFrame对象 |
on | 要加入的列或索引级别名称。 必须在左侧和右侧DataFrame对象中找到。如果未传递且left_index和right_index为False,则DataFrame中的列的交集将被推断为连接键。 |
left_on | 左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。 |
right_on | 右侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。 |
left_index | 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。 对于具有MultiIndex(分层)的DataFrame,级别数必须与右侧DataFrame中的连接键数相匹配。 |
right_index | 如果为True,则使用右侧DataFrame中的索引(行标签)作为其连接键。 对于具有MultiIndex(分层)的DataFrame,级别数必须与右侧DataFrame中的连接键数相匹配。 |
how | 默认inner。inner是取交集,outer取并集。比如left:[‘A’,‘B’,‘C’];right[’’A,‘C’,‘D’];inner取交集的话,left中出现的A会和right中出现的买一个A进行匹配拼接,如果没有是B,在right中没有匹配到,则会丢失。’outer’取并集,出现的A会进行一一匹配,没有同时出现的会将缺失的部分添加缺失值。 |
sort | 按字典顺序通过连接键对结果DataFrame进行排序。 默认为True,设置为False将在很多情况下显着提高性能。 |
suffixes | 用于重叠列的字符串后缀元组。 默认为(‘x’,’ y’)。 |
copy | 始终从传递的DataFrame对象复制数据(默认为True),即使不需要重建索引也是如此。 |
indicator | 将一列添加到名为_merge的输出DataFrame,其中包含有关每行源的信息。 _merge是分类类型,并且对于其合并键仅出现在“左”DataFrame中的观察值,取得值为left_only,对于其合并键仅出现在“右”DataFrame中的观察值为right_only,并且如果在两者中都找到观察点的合并键,则为left_only。 |
3.基础案例
3.1on关键字演示
on默认情况通过表格之间相同的列名作为匹配的键 Key,也可以通过赋予参数来指定列名作为键 Key。例如on=Key
Key可以是一个字符串,也可以是一个list。
下面两个 DataFrame df1 和 df2有相同的列名为‘性别‘和‘年龄’,默认这两列名组合成键 Key。df1 和 df2 对应键的交集是‘性别’和’年龄’。从原理出发,可以设计出另一种拼接方法效果一致(pd.merge (df1, df2, how = ‘inner’, on=[‘性别’,’年龄‘]))
运行代码:
import pandas as pddf1 = pd.DataFrame({'员工姓名':['张三','李红'],'性别':['男','女'],'年龄':['20','22'],'公司名称':['阿里巴巴有限公司','阿里巴巴有限公司']})df2 = pd.DataFrame({'员工姓名':['张三','李红'],'性别':['男','女'],'年龄':['20','22'],'工资':[10000,12000]})df = pd.merge(df1,df2)#df = pd.merge (df1, df2, how ='inner', on=['性别','年龄'])#删除#即可运行print("df1:\n{}".format(df1)) print("df2:\n{}".format(df2)) print("df:\n{}".format(df))
输出结果:
df1:员工姓名 性别年龄公司名称0 张三男20阿里巴巴有限公司1 李红女22阿里巴巴有限公司df2:员工姓名 性别年龄 工资0 张三男20100001 李红女2212000df:员工姓名 性别年龄公司名称 工资0 张三男20阿里巴巴有限公司100001 李红女22阿里巴巴有限公司12000
但是如果指定‘性别’列名为键 Key,结果又不一样了。在有相同的列名性别时,为了区分,默认会加上 _x 和 _y 后缀
。
相当于通过suffixes参数自定义后缀suffixes = [‘_x’,’_y’]
运行代码:
import pandas as pddf1 = pd.DataFrame({'员工姓名':['张三','李红'],'性别':['男','女'],'年龄':['20','22'],'公司名称':['阿里巴巴有限公司','阿里巴巴有限公司']})df2 = pd.DataFrame({'员工姓名':['张三','李红'],'性别':['男','女'],'年龄':['20','22'],'工资':[10000,12000]})df = pd.merge (df1, df2,on=['年龄'])# df = pd.merge (df1, df2,on=['年龄'],suffixes = ['_x','_y'])print("df1:\n{}".format(df1)) print("df2:\n{}".format(df2)) print("df:\n{}".format(df))
输出结果:
df1:员工姓名 性别年龄公司名称0 张三男20阿里巴巴有限公司1 李红女22阿里巴巴有限公司df2:员工姓名 性别年龄 工资0 张三男20100001 李红女2212000df:员工姓名_x 性别_x年龄公司名称 员工姓名_y 性别_y 工资0 张三男20阿里巴巴有限公司 张三男100001 李红女22阿里巴巴有限公司 李红女12000
3.2left_on 和 right_on 关键字
这两个参数通常是使用在两个DataFrame的列名都不相同,但表达意思相同。如例子中的员工姓名和姓名表达意思相同,就要用到left_on=‘员工姓名’和right_on= ‘姓名’来指定匹配的列,还可以把多余的列删除掉。
通过指定left_on=‘员工姓名’和right_on= ‘姓名’,我们可以得到这样的列。
代码:
import pandas as pddf1 = pd.DataFrame({'姓名':['张三','李红'],'公司名称':['阿里巴巴有限公司','阿里巴巴有限公司']})df2 = pd.DataFrame({'员工姓名':['张三','李红'],'工资':[10000,12000]})#df = pd.merge (df1, df2, left_on=['姓名'], right_on = ['员工姓名'])#df#axis = 0 是行 axis = 1是列,drop为删除方法df = pd.merge (df1, df2, left_on=['姓名'], right_on = ['员工姓名']).drop('员工姓名',axis = 1)df
3.3left_index 和 right_index 关键字
这两个参数使用的场景通常是我们需要合并列并且合并index,通过设置left_index=True和right_index=True使得键与index进行配合。
代码:
df1 = pd.DataFrame({'姓名':['张三','李红'],'公司名称':['阿里巴巴有限公司','阿里巴巴有限公司']})df2 = pd.DataFrame({'员工姓名':['张三','李红'],'工资':[10000,12000]})df1 = df1.set_index('姓名')df2 = df2.set_index('员工姓名')#合并df = pd.merge (df1, df2, left_index = True, right_index = True)df
还有混合 left/right_index 和right/left_on 关键字的用法,有兴趣的可以继续深入学习,本文不再介绍。
学习地址:Python 玩转数据 17 – Pandas 数据处理 合并 pd.merge() df1.merge(df2)_df.merge_wumingxiaoyao的博客-CSDN博客
3.4数据连接的类型
数据连接的类型:一对一连接,多对一连接,多对多连接,不同数据类型连接会有不同的差异。
3.4.1 一对一
代码:
import pandas as pddf1 = pd.DataFrame({'员工姓名':['张三','李红'],'公司名称':['阿里巴巴有限公司','阿里巴巴有限公司']})df2 = pd.DataFrame({'员工姓名':['张三','李红'],'工资':[10000,12000]})print(df1)print(df2) print(pd.merge(df1, df2))
结果:
员工姓名公司名称0 张三阿里巴巴有限公司1 李红阿里巴巴有限公司员工姓名 工资0 张三100001 李红12000员工姓名公司名称 工资0 张三阿里巴巴有限公司100001 李红阿里巴巴有限公司12000
3.4.2多对一
代码:
import pandas as pddf1 = pd.DataFrame({'编号':['001','002','003'],'学生姓名':['张三','李四','桃五']})print(df1)df2 = pd.DataFrame({'编号':['001','001','003'],'语文':[99,98,99],'数学':[115,118,120],'英语':[30,20,50],'月考月份':['1月','2月','1月']})print(df2)df_merge=pd.merge(df1,df2,on='编号')print(df_merge)
结果:
编号 学生姓名0001 张三1002 李四2003 桃五编号语文数学英语 时间000199 115301月100198 118202月200399 120501月编号 学生姓名语文数学英语 时间0001 张三99 115301月1001 张三98 118202月2003 桃五99 120501月
3.4.3多对多
代码:
import pandas as pddf1 = pd.DataFrame({'编号':['001','002','003','001','001'],'体育':[76,76,76,75,76]})print(df1)df2 = pd.DataFrame({'编号':['001','002','003','003','003'],'语文':[110,105,109,110,108],'数学':[105,88,120,123,119],'英语':[99,115,130,109,128]})print(df2)df_merge=pd.merge(df1,df2,on='编号')print(df_merge)
结果:
编号体育000176100276200376300175400176编号语文数学英语0001 110 105991002 10588 1152003 109 120 1303003 110 123 1094003 108 119 128编号体育语文数学英语000176 110 10599100175 110 10599200176 110 10599300276 10588 115400376 109 120 130500376 110 123 109600376 108 119 128
多对多关系会将所有信息一一匹配出来。
总结:
(1)on关键字:通过设置匹配的键 Key来合并数据。
(2)left_on 和 right_on 关键字:不同DataFrame合并相同意义列时使用。
(3)left_index 和 right_index 关键字:合并列并且合并index。