您现在的位置是:首页 > 技术教程 正文

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

admin 阅读: 2024-03-22
后台-插件-广告管理-内容页头部广告(手机)

目录

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=['性别',’年龄‘]))

运行代码:

  1. import pandas as pd
  2. df1 = pd.DataFrame({'员工姓名':['张三','李红'],'性别':['男','女'],'年龄':['20','22'],'公司名称':['阿里巴巴有限公司','阿里巴巴有限公司']})
  3. df2 = pd.DataFrame({'员工姓名':['张三','李红'],'性别':['男','女'],'年龄':['20','22'],'工资':[10000,12000]})
  4. df = pd.merge(df1,df2)
  5. #df = pd.merge (df1, df2, how ='inner', on=['性别','年龄']) #删除#即可运行
  6. print("df1:\n{}".format(df1))
  7. print("df2:\n{}".format(df2))
  8. print("df:\n{}".format(df))

输出结果: 

  1. df1:
  2. 员工姓名 性别 年龄 公司名称
  3. 0 张三 男 20 阿里巴巴有限公司
  4. 1 李红 女 22 阿里巴巴有限公司
  5. df2:
  6. 员工姓名 性别 年龄 工资
  7. 0 张三 男 20 10000
  8. 1 李红 女 22 12000
  9. df:
  10. 员工姓名 性别 年龄 公司名称 工资
  11. 0 张三 男 20 阿里巴巴有限公司 10000
  12. 1 李红 女 22 阿里巴巴有限公司 12000

但是如果指定'性别'列名为键 Key,结果又不一样了。在有相同的列名性别时,为了区分,默认会加上 _x 和 _y 后缀。

相当于通过suffixes参数自定义后缀suffixes = ['_x','_y']

运行代码:

  1. import pandas as pd
  2. df1 = pd.DataFrame({'员工姓名':['张三','李红'],'性别':['男','女'],'年龄':['20','22'],'公司名称':['阿里巴巴有限公司','阿里巴巴有限公司']})
  3. df2 = pd.DataFrame({'员工姓名':['张三','李红'],'性别':['男','女'],'年龄':['20','22'],'工资':[10000,12000]})
  4. df = pd.merge (df1, df2,on=['年龄'])
  5. # df = pd.merge (df1, df2,on=['年龄'],suffixes = ['_x','_y'])
  6. print("df1:\n{}".format(df1))
  7. print("df2:\n{}".format(df2))
  8. print("df:\n{}".format(df))

输出结果:

  1. df1:
  2. 员工姓名 性别 年龄 公司名称
  3. 0 张三 男 20 阿里巴巴有限公司
  4. 1 李红 女 22 阿里巴巴有限公司
  5. df2:
  6. 员工姓名 性别 年龄 工资
  7. 0 张三 男 20 10000
  8. 1 李红 女 22 12000
  9. df:
  10. 员工姓名_x 性别_x 年龄 公司名称 员工姓名_y 性别_y 工资
  11. 0 张三 男 20 阿里巴巴有限公司 张三 男 10000
  12. 1 李红 女 22 阿里巴巴有限公司 李红 女 12000

3.2left_on 和 right_on 关键字

这两个参数通常是使用在两个DataFrame的列名都不相同,但表达意思相同。如例子中的员工姓名姓名表达意思相同,就要用到 left_on='员工姓名' 和 right_on= '姓名'来指定匹配的列,还可以把多余的列删除掉。

 通过指定left_on='员工姓名' 和 right_on= '姓名',我们可以得到这样的列。

代码:

  1. import pandas as pd
  2. df1 = pd.DataFrame({'姓名':['张三','李红'],'公司名称':['阿里巴巴有限公司','阿里巴巴有限公司']})
  3. df2 = pd.DataFrame({'员工姓名':['张三','李红'],'工资':[10000,12000]})
  4. #df = pd.merge (df1, df2,
  5. left_on=['姓名'],
  6. right_on = ['员工姓名'])
  7. #df
  8. #axis = 0 是行 axis = 1是列,drop为删除方法
  9. df = pd.merge (df1, df2,
  10. left_on=['姓名'],
  11. right_on = ['员工姓名']).drop('员工姓名',axis = 1)
  12. df

3.3left_index 和 right_index 关键字

这两个参数使用的场景通常是我们需要合并列并且合并index,通过设置left_index=True 和 right_index=True使得键与index进行配合。

代码:

  1. df1 = pd.DataFrame({'姓名':['张三','李红'],
  2. '公司名称':['阿里巴巴有限公司','阿里巴巴有限公司']})
  3. df2 = pd.DataFrame({'员工姓名':['张三','李红'],
  4. '工资':[10000,12000]})
  5. df1 = df1.set_index('姓名')
  6. df2 = df2.set_index('员工姓名')
  7. #合并
  8. df = pd.merge (df1, df2,
  9. left_index = True,
  10. right_index = True)
  11. df

 还有混合 left/right_index 和right/left_on 关键字的用法,有兴趣的可以继续深入学习,本文不再介绍。

学习地址:Python 玩转数据 17 - Pandas 数据处理 合并 pd.merge() df1.merge(df2)_df.merge_wumingxiaoyao的博客-CSDN博客

3.4数据连接的类型

数据连接的类型:一对一连接,多对一连接,多对多连接,不同数据类型连接会有不同的差异。

3.4.1 一对一

代码:

  1. import pandas as pd
  2. df1 = pd.DataFrame({'员工姓名':['张三','李红'],
  3. '公司名称':['阿里巴巴有限公司','阿里巴巴有限公司']})
  4. df2 = pd.DataFrame({'员工姓名':['张三','李红'],
  5. '工资':[10000,12000]})
  6. print(df1)
  7. print(df2)
  8. print(pd.merge(df1, df2))

结果:

  1. 员工姓名 公司名称
  2. 0 张三 阿里巴巴有限公司
  3. 1 李红 阿里巴巴有限公司
  4. 员工姓名 工资
  5. 0 张三 10000
  6. 1 李红 12000
  7. 员工姓名 公司名称 工资
  8. 0 张三 阿里巴巴有限公司 10000
  9. 1 李红 阿里巴巴有限公司 12000

3.4.2 多对一

代码:

  1. import pandas as pd
  2. df1 = pd.DataFrame({'编号':['001','002','003'],
  3. '学生姓名':['张三','李四','桃五']})
  4. print(df1)
  5. df2 = pd.DataFrame({'编号':['001','001','003'],
  6. '语文':[99,98,99],
  7. '数学':[115,118,120],
  8. '英语':[30,20,50],
  9. '月考月份':['1月','2月','1月']})
  10. print(df2)
  11. df_merge=pd.merge(df1,df2,on='编号')
  12. print(df_merge)

结果:

  1. 编号 学生姓名
  2. 0 001 张三
  3. 1 002 李四
  4. 2 003 桃五
  5. 编号 语文 数学 英语 时间
  6. 0 001 99 115 30 1
  7. 1 001 98 118 20 2
  8. 2 003 99 120 50 1
  9. 编号 学生姓名 语文 数学 英语 时间
  10. 0 001 张三 99 115 30 1
  11. 1 001 张三 98 118 20 2
  12. 2 003 桃五 99 120 50 1

3.4.3 多对多

代码:

  1. import pandas as pd
  2. df1 = pd.DataFrame({'编号':['001','002','003','001','001'],
  3. '体育':[76,76,76,75,76]})
  4. print(df1)
  5. df2 = pd.DataFrame({'编号':['001','002','003','003','003'],
  6. '语文':[110,105,109,110,108],
  7. '数学':[105,88,120,123,119],
  8. '英语':[99,115,130,109,128]})
  9. print(df2)
  10. df_merge=pd.merge(df1,df2,on='编号')
  11. print(df_merge)

结果:

  1. 编号 体育
  2. 0 001 76
  3. 1 002 76
  4. 2 003 76
  5. 3 001 75
  6. 4 001 76
  7. 编号 语文 数学 英语
  8. 0 001 110 105 99
  9. 1 002 105 88 115
  10. 2 003 109 120 130
  11. 3 003 110 123 109
  12. 4 003 108 119 128
  13. 编号 体育 语文 数学 英语
  14. 0 001 76 110 105 99
  15. 1 001 75 110 105 99
  16. 2 001 76 110 105 99
  17. 3 002 76 105 88 115
  18. 4 003 76 109 120 130
  19. 5 003 76 110 123 109
  20. 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

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜