Python pd.merge()函数介绍(全)
后台-插件-广告管理-内容页头部广告(手机) |
目录
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 pd
- df1 = 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 张三 男 20 10000
- 1 李红 女 22 12000
- df:
- 员工姓名 性别 年龄 公司名称 工资
- 0 张三 男 20 阿里巴巴有限公司 10000
- 1 李红 女 22 阿里巴巴有限公司 12000
但是如果指定'性别'列名为键 Key,结果又不一样了。在有相同的列名性别时,为了区分,默认会加上 _x 和 _y 后缀。
相当于通过suffixes参数自定义后缀suffixes = ['_x','_y']
运行代码:
- import pandas as pd
- df1 = 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 张三 男 20 10000
- 1 李红 女 22 12000
- df:
- 员工姓名_x 性别_x 年龄 公司名称 员工姓名_y 性别_y 工资
- 0 张三 男 20 阿里巴巴有限公司 张三 男 10000
- 1 李红 女 22 阿里巴巴有限公司 李红 女 12000
3.2left_on 和 right_on 关键字
这两个参数通常是使用在两个DataFrame的列名都不相同,但表达意思相同。如例子中的员工姓名和姓名表达意思相同,就要用到 left_on='员工姓名' 和 right_on= '姓名'来指定匹配的列,还可以把多余的列删除掉。
通过指定left_on='员工姓名' 和 right_on= '姓名',我们可以得到这样的列。
代码:
- import pandas as pd
- df1 = 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 pd
- df1 = pd.DataFrame({'员工姓名':['张三','李红'],
- '公司名称':['阿里巴巴有限公司','阿里巴巴有限公司']})
- df2 = pd.DataFrame({'员工姓名':['张三','李红'],
- '工资':[10000,12000]})
- print(df1)
- print(df2)
- print(pd.merge(df1, df2))
结果:
- 员工姓名 公司名称
- 0 张三 阿里巴巴有限公司
- 1 李红 阿里巴巴有限公司
- 员工姓名 工资
- 0 张三 10000
- 1 李红 12000
- 员工姓名 公司名称 工资
- 0 张三 阿里巴巴有限公司 10000
- 1 李红 阿里巴巴有限公司 12000
3.4.2 多对一
代码:
- import pandas as pd
- df1 = 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)
结果:
- 编号 学生姓名
- 0 001 张三
- 1 002 李四
- 2 003 桃五
- 编号 语文 数学 英语 时间
- 0 001 99 115 30 1月
- 1 001 98 118 20 2月
- 2 003 99 120 50 1月
- 编号 学生姓名 语文 数学 英语 时间
- 0 001 张三 99 115 30 1月
- 1 001 张三 98 118 20 2月
- 2 003 桃五 99 120 50 1月
3.4.3 多对多
代码:
- import pandas as pd
- df1 = 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)
结果:
- 编号 体育
- 0 001 76
- 1 002 76
- 2 003 76
- 3 001 75
- 4 001 76
- 编号 语文 数学 英语
- 0 001 110 105 99
- 1 002 105 88 115
- 2 003 109 120 130
- 3 003 110 123 109
- 4 003 108 119 128
- 编号 体育 语文 数学 英语
- 0 001 76 110 105 99
- 1 001 75 110 105 99
- 2 001 76 110 105 99
- 3 002 76 105 88 115
- 4 003 76 109 120 130
- 5 003 76 110 123 109
- 6 003 76 108 119 128
多对多关系会将所有信息一一匹配出来。
总结:
(1)on关键字:通过设置匹配的键 Key来合并数据。
(2)left_on 和 right_on 关键字:不同DataFrame合并相同意义列时使用。
(3)left_index 和 right_index 关键字:合并列并且合并index。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |