Python pd.merge()函数介绍(全)
目录
3.3left_index 和 right_index 关键字
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