目录

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。

推荐阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: