在使用Excel时,我用的最多函数就是vlookup;在使用SQL查询的时候,我用的最多应该是join;这两个都有相同的功能,将多表匹配、合并,然后达到对比、查漏等等效果。在pandas里面也有类似的功能函数就是pd.merge()(pd是指 导入的pandas库)。merge的用法跟SQL中join很像。
df1 df2使用merge进行合并:
使用merge进行合并基本的结构为:pd.merge(df1,df2,合并方式,df1合并用的键,df2合并用的键)。
后面两个参数在合并的时候两个表格使用的键的列名是一样的时候可以改成on='title':
on='title'结果和第一种方式是一样的。
使用合并的时候pandas会默认只选取一个相同的键列名,然后其它的数据进行合并。
注意到两张表格中有一个location_road是共同具有的一个列,因此合并之后两个表格的location_road列分别加上了_x和_y的后缀以便区分,这两个后缀也可以修改的(使用suffixes函数进行修改):
使用suffixes函数修改后缀merge函数还可以只取其中的某几列数据进行合并:
选择某几列进行合并选择某几列的时候需要注意的是如果使用on参数,那么此参数指定的值两个表格都要有;还有一个非常重要的就是选择多列的时候使用的是两个中括号。
使用merge合并方式有left, inner, right,outer,通过how参数来指定。
how = 'inner'表示的是只合并两个表格都具有的行;
how = 'left'表示的是合并之后显示的是第一个表格里的所有行;
how = 'left' 第一个表与合并之后的表对比how = 'right'表示的是合并之后显示的是第二个表格里所有的行;
细心的人肯定会发现了,为什么使用how = 'right'合并之后的行数不是等于第二个表的行数呢?这是因为在第一个表的title列中有一个重复值被计算进去了,所有多了一行(关于重复值的去除方法可以参考duplicated那篇的内容)。
how = 'outer'表示的是两个表格里所有的行都进行合并。
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,这个参数会添加一列用来注明每一行是来自于哪个表的:
使用indicator=True以上所说的都是横向合并,那么如果要进行纵向合并要怎么操作呢?
merge()里并没有axis=0这个参数,如果需要纵向匹配合并的话可以先将表格转置(.T)之后再进行合并。
网友评论