文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python pd.merge()函数介绍(全)

2023-09-23 18:00

关注

目录

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   张三  男  20  100001   李红  女  22  12000df:  员工姓名 性别  年龄      公司名称     工资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   张三  男  20  100001   李红  女  22  12000df:  员工姓名_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)

结果:

  编号 学生姓名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 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)

结果:

  编号  体育0  001    761  002    762  003    763  001    754  001    76  编号  语文  数学  英语0  001   110   105    991  002   105    88   1152  003   109   120   1303  003   110   123   1094  003   108   119   128  编号  体育  语文  数学  英语0  001    76   110   105    991  001    75   110   105    992  001    76   110   105    993  002    76   105    88   1154  003    76   109   120   1305  003    76   110   123   1096  003    76   108   119   128

多对多关系会将所有信息一一匹配出来。

总结:

(1)on关键字:通过设置匹配的键 Key来合并数据。

(2)left_on 和 right_on 关键字:不同DataFrame合并相同意义列时使用。

(3)left_index 和 right_index 关键字:合并列并且合并index。

来源地址:https://blog.csdn.net/m0_61635017/article/details/130158080

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯