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

目录


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。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年9月15日
下一篇 2023年9月15日

相关推荐