在使用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表示使用右表中的某一列和左表的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
|