在这里插入图片描述

在使用pandas时,由于有join, merge, concat几种合并方式,而自己又不熟的情况下,很容易把几种搞混。本文就是为了区分几种合并方式而生的。

文章目录


merge

merge用于左右合并(区别于上下堆叠类型的合并),其类似于SQL中的join,一般会需要按照两个DataFrame中某个共有的列来进行连接,如果不指定按照哪两列进行合并的话,merge会自动选择两表中具有相同列名的列进行合并(如果没有相同列名的列则会报错)。这里要注意用于连接的列并不一定只是一列。

用法

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

ok,例:

>>> import pandas as pd
>>> df1 = pd.DataFrame({'A':list('abcd'), 'B':list('efgh'), 'C': list('ijkl')})
>>> df1
   A  B  C
0  a  e  i
1  b  f  j
2  c  g  k
3  d  h  l
>>> df2 = pd.DataFrame({'X':list('qwer'), 'Y':list('asdf'), 'C': list('ijkl')})
>>> df2
   X  Y  C
0  q  a  i
1  w  s  j
2  e  d  k
3  r  f  l
>>> df1.merge(df2) # 这里默认以两表的共有列C进行连接
   A  B  C  X  Y
0  a  e  i  q  a
1  b  f  j  w  s
2  c  g  k  e  d
3  d  h  l  r  f
  • merge中可以使用参数on选择共有的列,用在上面的例子中的话就是df1.merge(df2, on='C')
  • 如果两表中用于连接的列的列名不同,使用left_on, right_on选择两个表中用于连接的列
  • 此外使用how参数选择最终结果需要保存的内容,有四种方式inner, outer, left, right
    • inner表示只保存用于连接的两列所共有的值(也就是交集)
    • outer表示保存用于连接的两列中出现的所有值(也就是并集)
    • left表示只保存用于连接的左表的所有值对应的结果,如果某值只在右表的连接列中出现,那么就不会被保存
    • right与left相反
  • suffixes参数可以用于给两表的相同列名加上后缀,默认为(‘x’, ‘y’)
  • left_index为True时表示使用左表的index作为连接键,right_index类似

上面的参数就不一一举例展示了。

join

join比较简单,其用于将两表按照索引列进行合并,能使用的参数也相对比较少

DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)

这里简单介绍一下参数:

  • other就是另一张表
  • on表示使用左边表中的某一列和右表(即上面的other表)的index来连接
  • how和上面一样
  • lsuffix, rsuffix和上面一样,只是分开写了而已
  • sort默认为False即不排序,但是如果为True时表示按照合并时使用到的值进行排序(也就是两表的索引或者左表的索引+右表的某一列)

concat

concat的功能相对多一点,其一般用于堆叠,可以用于纵向和横向的堆叠,只需要对应地选择axis参数即可。在堆叠时如果要堆叠的方向有相同的列名(如果是横向那么就是索引名),那么会自动堆叠在一起,其余没有同名的列(或索引)就会根据使用的join参数决定去留。

pandas.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, 
				names=None, verify_integrity=False, sort=False, copy=True)

参数:

  • 要注意的是concat传入的是一个列表,如pd.concat([df1, df2])这样
  • axis表示选择哪一个方向的堆叠,0为纵向(默认),1为横向
  • join,与上面的how类似
  • ignore_index表示当索引无意义时忽略索引进行堆叠
  • 其余先不介绍啦,用到的应该也不多

本文举例比较少,但是是将三者的区别写的比较详细,若是需要的话读者可以自行尝试一下,相信聪明的你肯定没问题啦!

参考:https://blog.csdn.net/brucewong0516/article/details/82707492
参考:https://pandas.pydata.org/pandas-docs/stable/index.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐