3.19 合并两个数据帧
问题描述
合并两个数据帧。
解决方案
要进行等值连接(inner join),就需要使用merge并用on参数来指定哪些列要合并:
merge默认进行等值连接。如果要进行外连接(outer join),可以通过how参数来指定:
使用how参数还可以指定是左连接还是右连接:
也可以指定每个数据帧中的列名来进行合并:
如果想根据数据帧的索引合并两列,可以将left_on和right_on参数替换成right_index=True以及left_index=True。
讨论
很多时候我们需要使用的数据是很复杂的,而且它们并不总是完整的。
其实在真实场景中,数据集通常是分散的,它们来自对数据库的多次查询或者多个文件。所以,为了将所有数据放在一起,通常需要先将每一份从数据库查询得到的数据或文件作为数据帧加载到pandas中,然后再将它们合并为一个大的数据帧。
这个过程对于用过SQL(一个常用来做数据合并操作(join)的语言)的人来说可能很熟悉。尽管在pandas中使用的具体参数不一样,但是它所遵循的大致模式与其他语言和工具没有什么区别。
对于任何merge操作,都需要说明三个方面的信息。第一,必须指定想要合并哪两个数据帧。在上述解决方案中,它们是dataframe_employees和dataframe_sales。第二,必须指定要根据哪两列实施合并,也就是说在两个数据帧中需要共享哪一列的值。比如,在上述解决方案中,两个数据帧都有一列叫作employee_id,为了将这两个数据帧合并,只需要找到每个数据帧的employee_id列中能匹配的值,并把它们拼接起来就行。
如果这两列使用相同的名字,可以使用on参数。如果它们的名字不一样,则需要使用left_on和right_on。
左/右数据帧是怎么定义的呢?简单来说,左数据帧是在merge中指定的第一个数据帧,右数据帧就是第二个。在我们解释下一组参数时,还会用到左/右数据帧的概念。
最后一个参数,也是大多数人都很难理解的参数,是指合并操作的类型,由how参数来指定。merge支持如下4个主要的连接类型。
Inner
只返回指定列的值在两个数据帧中都存在的行。例如,只有employee_id的值在dataframe_employees和dataframe_sales中都出现时,才会返回行。
Outer
返回两个数据帧的所有行。如果某一行只在其中一个数据帧中存在,就用NaN来填充缺失的值。例如,返回dataframe_employees和dataframe_sales的所有行。
Left
返回左数据帧的所有行,对于右数据帧,只返回在左数据帧中能找到匹配值的行。用NaN来填充缺失的值。例如,返回dataframe_employees的所有行,但是对于dataframe_sales,只返回它的employee_id出现在dataframe_employees中的那些行。
Right
返回右数据帧的所有行,对于左数据帧,只返回在右数据帧中能找到匹配值的行。用NaN来填充缺失的值。例如,返回dataframe_sales的所有行,但是对于dataframe_employees,只返回它的employee_id出现在dataframe_sales中的那些行。
如果你无法一下子理解上述所有概念,推荐你自己动手写代码调试一下how参数,看一看它是如何影响merge的输出的。
延伸阅读
● 对SQL Join操作的可视化解释(http://bit.ly/2Fxgcpe)
● pandas中关于合并操作的文档(http://bit.ly/2Fuo4rH)
本书评论