Pandas中的数据维度拓展:join or merge

在数据分析过程中需要整合多个维度的数据信息。如果在同一数据库上的话,使用SQL处理连接是比较直观的操作,但是在实际情况中往往并非如此,这样在分析的时候就需要利用Pandas将多个数据源数据组合在一起,这个时候就可以利用DataFrame的join或者merge方法了。

连接的类型

在StackOverflow上有人总结到:

Pandas merge is to outer/inner join and Pandas join is to natural join

这个总结是高度抽象的,而且把问题抛回到了SQL上。SQL中的连接有很多种,例如自然连接、外连接、等值连接等一系列方法,这些不同的连接代表了不同的数据处理方法。

自然连接和inner连接的行为很相似,两者筛选的记录数量是相同的,但是返回的列数据由细微差别,自然连接避免重复的Key列。自然连接和inner连接的侧重点是两个集合体中相同或者说重叠的那一部分,其余的部分则不会出现在结果中,但是在外连接中,关注的则不仅仅是重叠的报复。例如left join则不仅仅包含重叠,还包含的左侧未匹配上的记录。

在一般的分析过程中,往往进行的都是外连接,而且通常都是left join。这是因为连接的目的在于拓展维度,对于某些记录而言,可能缺少目标维度,但是不能就此删除目标记录。使用left join则可以保持这部分记录,即使不需要分析这部分的记录,也可以通过where 条件 (t.xxx is not null) 来去除这部分记录。

所以在Pandas的分析过程中使用Merge方法应该就可以满足需求,join方法仅作了解即可。

Merge的使用方法

Merge DataFrame or named Series objects with a database-style join.

Merge方法的主要参数有:

  • right :拓展维度的数据集
  • how :连接的方法,默认为inner,可以更改为left、right或者outer;
  • on :连接的关键字段(Column或者index)
  • left_on / right_on :两个数据源上连接的字段名称可能不同,需要分别说明

如上就基本完成了

Join的使用方法

Join columns of another DataFrame

按照前面的说法,DataFrame中的join方法对应的是自然连接,但是在这个方法中也提供了how参数,而且候选数值也是包括了left、join以及inner等,而且效果和Merge中的left、right等相同。这也意味着说join方法仅代表自然连接的是作者的错误理解了。

Join方法的主要参数有:

  • right :拓展维度的数据集
  • how :连接的方法,默认为inner,可以更改为left、right或者outer
  • on :Column or index level name(s) in the caller to join on the index in other
  • lsuffix / rsuffix :相同的column的后缀。这个在Merge方法中有默认参数。

从Join和Merge方法的参数上看,Merge的灵活度要高于Join,例如可以指定left_on和right_on,而且对于相同的数列会默认添加后缀。所以Merge使用范围应该更广,只不过Merge的默认连接参数是inner,大多数情况下可能需要手动更改为left。

Join 方法只能针对索引

虽然在文档上介绍Join的on参数可以指定特定的Column, 但是实践过程的结果就是会报错。

1
2
3
4
5
df = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3', 'K4', 'K5'],
'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']})
other = pd.DataFrame({'key': ['K0', 'K1', 'K2'],
'A': ['B0', 'B1', 'B2']})
df.join(other, on = "A" ,lsuffix='_caller', rsuffix='_other')

出现的结果是:ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat。错误的原因在于,在参数on中指定为’A’,只是意味着从df中选择的A列,但是other中依然会选择index进行计算。

所以在使用on参数的时候,需要注意同时修改right数据的index。

1
df.join(other.set_index("A"), on = "A" ,lsuffix='_caller', rsuffix='_other')

如上就可以得到正确结果。

所以Join和Merge两者最大的区别:join是基于index进行的关联,而merge可以指定特定数据列。

参考文档

what-is-the-difference-between-join-and-merge-in-pandas Pandas merge is to outer/inner join and Pandas join is to natural join ,那么问题来了,什么是自然连接;而且这个说法也并非可靠,在join方法中也有how参数。

自然连接 百度百科 自然连接是去掉重复列的等值连接如果把舍弃的元组也保存在结果关系中,而在其他属性上空值,那么这种连接就叫外连接 这样就给出了几个连接之间的关系了

How to join (merge) data frames (inner, outer, right, left join) in pandas python 通过图形给出了几种join之间的差异

difference-between-natural-join-and-inner-join the number of columns returned自然连接是删除了重复的key column

本文原创,请随意转载,但请添加文章链接,并将链接放置在文章开头,谢谢。

随手请吃块糖呗