当前位置:   article > 正文

merge函数_pandas数据合并之一文弄懂pd.merge()

pd.merge(
43e2d981c2b565ad992ec0f50a123491.png

CDA数据分析师 出品

在合并数据的操作中,除了pd.concat()函数,另一个常用的函数就是pd.merge()了,这两个函数也经常被拿来比较,其实只要弄懂了函数中重要参数的作用理解了每个函数的用法,自然就知道在哪种情况下使用哪一个函数,需要对函数中的哪个参数进行怎样的设置了。好了,让我们步入正题来认识一下pd.merge()函数吧!

pd.merge()函数介绍

在函数的官方文档里就有写到pd.merge()的作用是用数据库样式的连接合并DataFrame或者已命名的Series。现在我们一起看一下这个函数的庐山真面目吧:

pd.merge( left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None,)

以上是pd.merge()函数的所有参数,下边我们通过例子对常用参数进行讲解。

参数left和right

和pd.concat()不同,pd.merge()只能用于两个表的拼接,而且通过参数名称也能看出连接方向是左右拼接,一个左表一个右表,而且参数中没有指定拼接轴的参数,所以pd.merge()不能用于表的上下拼接。

如果需要拼接的两个表中,有相同的列信息,那么进行拼接的时候即使不指定以哪个字段作为主键函数也会默认用信息相同的列做主键对两个表进行拼接,如下例:

假设这是来自人力部门对员工信息的统计表

732077c4e3f57e39019b42f5442924ca.png

假设这是来自销售部门对员工销售业绩的统计表

5254b50150013e7242e95f0935a93729.png

能够看出这两个表中的员工是同一批人,而且两个表中也只有"员工姓名"一列重复列,一般这种情况直接用pd.merge()拼接不用指定主键,直接把一个表的名字传递给参数left,另一个表的名字传递给参数right就可以了:

9aac89dd1475fe94e98b3cb6fe692468.png

参数on

这个参数确定哪个字段作为主键,上边提到如果有相同的列信息不指定主键也可以,这里我们指定一下主键,看下结果和上文中没有指定主键的结果是不是一致:

2529ba7eaf300121439e2b23f2d266e0.png

的确是完全一致的。

那么除了这种情况,参数on还有哪些作用呢?如果两个表中有两列以上信息相同,可以指定哪一列作为主键,如果不指定,相同信息的列都会作为拼接依据:

3a5f1e09d7b79e81539096c9f0ed8682.png
dcb0a61810ec38900a4c5f2b2e525267.png

这两个表能够看出有两列列名是一样的,工号和员工姓名,而且自己看的话还能发现索引是5的记录虽然员工姓名一样但是工号不一样,有可能一个公司中出现了重名的员工,我们对这两个表进行拼接。

不指定主键的情况下:

200fb61f2baa1e4564e763dc43e04e0a.png

由于pd.merge()默认的是内连接,所以只把主键信息相同的部分拼接,而工号和员工姓名完全一致的只有工号是004的信息

指定主键拼接:

03fa1c3136a6adf98f08fdcedbb5deed.png

指定主键为员工姓名,所以只要员工姓名对的上,信息就会被保留,注意这里用到的连接方式是内连接。

参数leftindex和rightindex

除了指定字段作为主键以外,还可以考虑用索引作为拼接的主键,leftindex和rightindex默认为False,就是不以索引作为主键,调整为True就可以了。下边两个表格有相同的索引:

a01c5260e3d2a1bc5d10f14fbf12434e.png
1674205e59dd76ba81b9faa8ba863a3c.png

通过索引进行拼接后:

7295a5d533c745ef11fb284c60d46c6d.png

由于两个表的索引完全一样,所以拼接效果很好,如果索引有不能对齐的地方,在默认的内连接情况下,只会把索引对齐的记录进行拼接

参数how

how参数控制拼接方式,默认内连接(inner),那么不同的拼接方式对结果有怎样的影响呢,内连接是只将两个表主键一致的信息拼接到一起,上边的例子已经演示过,下边来看一下外连接。

外连接是保留两个表的所有信息,拼接的时候遇到标签不能对齐的部分,用NAN进行填充:

11528f54c1aa98f77fb941a5a920dff3.png

左连接是保留所有左表的信息,把右表中主键与左表一致的信息拼接进来,标签不能对齐的部分,用NAN进行填充:

f640885bcf23f8e6528af261e9f8094e.png

右连接是保留所有右表的信息,把左表中主键与左表一致的信息拼接进来,标签不能对齐的部分,用NAN进行填充:

c30219bd2e6391f22dddcaf07802ca42.png

参数lefton和righton

有的时候还会有这种情况,两个表里没有完全一致的列名,但是有信息一致的列,例如下边这种情况,都有"员工姓名"这一列,但是名字不一样:

a01c5260e3d2a1bc5d10f14fbf12434e.png
1674205e59dd76ba81b9faa8ba863a3c.png

这个时候需要指定每个表中用来做主键的字段是哪一个,就用到了lefton和righton这两个参数:

参数suffixes

有时候两个表中有好几个相同的列名,除了作为主键的列之外,其他名字相同的列被拼接到表中的时候会有一个后缀表示这个列来自于哪个表格,用于区分名字相同的列,这个后缀默认是(x和y),例如这个拼接的结果,能看到员工姓名作为主键,拼接后的表里有两个"工号"列,而且后边会有后缀:

03fa1c3136a6adf98f08fdcedbb5deed.png

这个后缀是可以进行更改的,控制它的参数就是suffixes,我将后缀改成了(left和right),实际工作中根据需求进行更改就可以。

700cbd1dca605e585f9abc9cdc334e7d.png

参数indicator

在pd.concat()中可以通过参数设定显示拼接后的表中哪些信息来自于哪一个表格,在pd.merge()中也可以进行这样的操作,就是通过indicator参数设置,默认是False不显示数据来源,把参数设置为True就可以了。

59dd9396901f43f81722df861e2316d4.png

这样在表的最后就会有一个新列,显示这一条记录来自于在哪表格里有数据,如果两表都有数据会标记both。

以上就是pd.merge()函数常用的参数设置了,可以解决大部多数需要用到该函数进行数据合并的问题。

5caf0f31452b6895b6355f0859de51c8.png

更多优质内容及精彩资讯,可点击【了解更多】迅速进入!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/697201
推荐阅读
相关标签
  

闽ICP备14008679号