目录
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 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。