17、pandas的merge合并函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17、pandas的merge合并函数相关的知识,希望对你有一定的参考价值。

参考技术A 在使用Excel时,我用的最多函数就是vlookup;在使用SQL查询的时候,我用的最多应该是join;这两个都有相同的功能,将多表匹配、合并,然后达到对比、查漏等等效果。在pandas里面也有类似的功能函数就是pd.merge()(pd是指 导入的pandas库)。merge的用法跟SQL中join很像。

使用merge进行合并:

基本的结构为:pd.merge(df1,df2,合并方式,df1合并用的键,df2合并用的键)。

后面两个参数在合并的时候两个表格使用的键的列名是一样的时候可以改成 on='title' :

结果和第一种方式是一样的。

使用合并的时候pandas会默认只选取一个相同的键列名,然后其它的数据进行合并。

注意到两张表格中有一个location_road是共同具有的一个列,因此合并之后两个表格的location_road列分别加上了_x和_y的后缀以便区分,这两个后缀也可以修改的( 使用suffixes函数进行修改 ):

merge函数还可以只取其中的某几列数据进行合并:

选择某几列的时候需要注意的是如果使用 on参数 ,那么此参数指定的值两个表格都要有;还有一个非常重要的就是 选择多列的时候使用的是两个中括号 。

使用merge合并方式有 left, inner, right,outer,通过how参数来指定。

how = 'inner'表示的是只合并两个表格都具有的行;

how = 'left'表示的是合并之后显示的是第一个表格里的所有行;

how = 'right'表示的是合并之后显示的是第二个表格里所有的行;

细心的人肯定会发现了,为什么使用how = 'right'合并之后的行数不是等于第二个表的行数呢?这是因为在第一个表的title列中有一个重复值被计算进去了,所有多了一行(关于重复值的去除方法可以参考duplicated那篇的内容)。

how = 'outer'表示的是两个表格里所有的行都进行合并。

在使用left,right,outer的时候会产生空值,只要在语句的后面加.fillna(o)就可以填充空值了。

这也是pandas很方便的一个特点:多个函数可以连在一起使用,只要用点连接起来就可以了。

如果合并的时候要用索引作为键的话就不能用on,left_on和right_on了,而是要使用left_index=True, right_index=True(也就是以索引为标准来进行表联结,而不是两个表共同拥有的列)。

因为是以索引作为联结的,所以title不是对应的,这个暂时还不清楚有什么比较好的应用场景。

还有这个方法合并的时候是安装键的顺序进行排列的,如果两个表都很大的话合并时就会很慢,如果不需要排序就需要添加参数sort=False。

merge还有一个参数,indicator=True,这个参数会添加一列用来注明每一行是来自于哪个表的:

以上所说的都是横向合并,那么如果要进行纵向合并要怎么操作呢?

merge()里并没有axis=0这个参数,如果需要纵向匹配合并的话可以先将表格 转置(.T) 之后再进行合并。

pandas 合并数据函数merge join concat combine_first 区分

  pandas对象中的数据可以通过一些内置的方法进行合并:pandas.merge,pandas.concat,实例方法join,combine_first,它们的使用对象和效果都是不同的,下面进行区分和比较。

  数据的合并可以在列方向和行方向上进行,即下图所示的两种方式:

  

 pandas.merge和实例方法join实现的是图2列之间的连接,以DataFrame数据结构为例讲解,DataFrame1和DataFrame2必须要在至少一列上内容有重叠,index也好,columns也好,只要是有内容重叠的列即可,指定其中一列或几列作为连接的键,然后按照键,索引DataFrame2其他列上的的数据,添加DataFrame1中。例,以columns内容作为连接键:

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
df1 = DataFrame({\'key\': [\'b\', \'b\', \'a\', \'c\', \'a\', \'a\', \'b\'],
                 \'data1\': range(7)})
df2 = DataFrame({ \'key\': [\'a\', \'b\', \'d\'],
                 \'data2\': range(3),
                 \'data3\':range(3,6)})
DF1=pd.merge(df1, df2)

通过设置merge参数\'on\',\'left_on\',\'right_on\'可以指定用来连接的列(即关键的重复内容列),也可以将index作为连接键,只要传入left_index=Trueright_index=True(或两个都传)来说明索引被用作连接键,例:

 

left1 = DataFrame({\'key\': [\'a\', \'b\', \'a\', \'a\', \'b\', \'c\'],
                  \'value\': range(6)})
right1 = DataFrame({\'group_val\': [3.5, 7]}, index=[\'a\', \'b\'])
lr=pd.merge(left1, right1, left_on=\'key\', right_index=True)

  而实例方法join默认通过index来进行连接,例:

left2 = DataFrame([[1., 2.], [3., 4.], [5., 6.]], index=[\'a\', \'c\', \'e\'],
                 columns=[\'Ohio\', \'Nevada\'])
right2 = DataFrame([[7., 8.], [9., 10.], [11., 12.], [13, 14]],
                   index=[\'b\', \'c\', \'d\', \'e\'], columns=[\'Missouri\', \'Alabama\'])
lr2=left2.join(right2, how=\'outer\')

 join方法也可以通过列来连接,同样设置参数‘on’即可。

  上面介绍的函数实现的均是列之间的连接,要实现行之间的连接,要使用pd.concat方法,例:

s1 = Series([0, 1], index=[\'a\', \'b\'])
s2 = Series([2, 3, 4], index=[\'c\', \'d\', \'e\'])
s3 = Series([5, 6], index=[\'f\', \'g\'])
ss=pd.concat([s1, s2, s3])
st=pd.concat([s1,s2,s3],axis=1)

concat默认在axis=0上工作(沿着负y轴的方向),当设置axis=1时(沿着x轴的方向),它同时也可以实现列之间的连接,产生一个DataFrame。

  最后一个实例方法combine_first,它实现既不是行之间的连接,也不是列之间的连接,它在为数据“打补丁”:用参数对象中的数据为调用者对象的缺失数据“打补丁”。例:

a = Series([np.nan, 2.5, np.nan, 3.5, 4.5, np.nan],
           index=[\'f\', \'e\', \'d\', \'c\', \'b\', \'a\'])
b = Series(np.arange(len(a), dtype=np.float64),
           index=[\'f\', \'e\', \'d\', \'c\', \'b\', \'a\'])
b[-1] = np.nan
c=b[:-2].combine_first(a[2:])
df1 = DataFrame({\'a\': [1., np.nan, 5., np.nan],
                 \'b\': [np.nan, 2., np.nan, 6.],
                 \'c\': range(2, 18, 4)})
df2 = DataFrame({\'a\': [5., 4., np.nan, 3., 7.],
                 \'b\': [np.nan, 3., 4., 6., 8.]})
df=df1.combine_first(df2)

  简单总结来说,通过merge和join合并的数据后数据的列变多,通过concat合并后的数据行列都可以变多(axis=1),而combine_first可以用一个数据填充另一个数据的缺失数据。

注:以上所有实验都是默认的“inner”连接方式(交集),可以通过“how”参数改变。

 

  

 

 

以上是关于17、pandas的merge合并函数的主要内容,如果未能解决你的问题,请参考以下文章

pandas 合并数据函数merge join concat combine_first 区分

第十四节:pandas之merge()合并

在 pandas.merge_asof 之后保留两个合并键

在合并函数pandas中验证

Pandas中DataFrame数据合并连接(concatmergejoin)之merge

pandas合并/连接