数据规整化(一)——合并

1. 数据库形式的合并

pandas对象的数据可以通过一些内置的方式高效的完成合并工作,其中以 merge和 concat方法运用的最为常见,pandas的合并方式可以大致分类为 数据库形式的合并(形式很像MySQL)和索引上的合并两种。

使用的是 pandas的 mergejoin方法

1)merge方法

参数说明

merge方法的参数如下,
在这里插入图片描述
在这里插入图片描述

基本使用

具体使用,首先构建两个DataFrame,
在这里插入图片描述
在这里插入图片描述

merge方法on相关参数

默认情况下,会按照两个Dataframe共有的列进行合并,不过实际应用时最好使用 on参数对合并进行指定,
在这里插入图片描述
如果两个Dataframe没有共有列,merge方法也提供了 left_onright_on参数指定,
在这里插入图片描述

merge方法index相关参数

相似的 left_indexright_index参数是通过索引进行合并,传入的是True或者False,“_index"方法和"_on"方法可以配合使用,
在这里插入图片描述
将 left1 的“key”列与 right1 的索引列关联,得到合并后的DataFrame,
在这里插入图片描述
更为强大的是 层次化索引也能够进行on合并,构建两个层次化索引的DataFrame,
在这里插入图片描述
在这里插入图片描述
合并的结果是 lkey 和 rkey两列中 c和d相关的数据缺失了,因为默认情况下进行的是取交集的合并运算。

merge方法how参数

当想要通过并集方式合并两个Dataframe时,将how参数进行修改,默认情况下,how参数的值为"inner"。当做并集运算时,设定 how=“outer”,
在这里插入图片描述
没有匹配上的数据会按照缺失值进行处理。除了"inner"、“outer”,how参数可取的值还有"left"和"right",分别为左连接和右连接,
在这里插入图片描述
指定how参数为left,
在这里插入图片描述
上方的实例是左连接,df1中的key有a、b、c三个值,左连接过后,新生成的Dataframe拥有与df1相同的key列的值,df2中没有的值,合并后会使用缺失值NaN进行填补。

笛卡尔积与多列一同merge

从上面的实例中可以看出,原本df1中有3个b,合并后变成6个b,因为df2中b有两个不同的记录,这就是多对多连接时的笛卡尔积(可以理解为on参数只传入一个值的情况)。

合并不仅仅局限于一列的合并,如果想使用多列进行合并时,可以传入一个Python列表,列表中的元素是Dataframe的列名,将这个列表传递给 on、left_on或者right_on参数,就可以同时依据这几列进行合并,
在这里插入图片描述
在这里插入图片描述
上方代码中因为 how参数设定的是并集运算(“outer”),如果是inner,则只会有key1 和 key2的公共部分 “foo one”, “bar two”。

当合并时候,有相同的列时,合并后pandas会自动加上"_x"、"_y"等后缀进行区分,就是下面这种形式,
在这里插入图片描述
可以使用 suffixes参数对后缀名进行指定,
在这里插入图片描述

2)join方法

基本使用

join方法能够更便捷的对索引进行合并
在这里插入图片描述
在这里插入图片描述

join方法how参数

上面的代码中,how参数设定的是"outer",如果没有设定how参数,因为一些历史原因,join默认是"left"方式进行合并,即左连接。
在这里插入图片描述
在这里插入图片描述

join方法合并两个以上DataFrame

join的另一个特点就是可以同时将三个Dataframe进行合并,
在这里插入图片描述

2. 轴向连接(concat方法)

轴向连接使用的是pandas的 concat方法

参数说明

在这里插入图片描述
在这里插入图片描述

concat方法axis参数

相较于merge方法,concat方法能够同时合并两个及以上的Series和Dataframe,默认的 axis参数为0,即在竖直方向上对数据进行合并;如果为1,就是在水平方向上对数据进行合并。
在这里插入图片描述
指定axis参数值为0,竖直方向上进行合并,
在这里插入图片描述

concat方法join参数

默认情况下,join参数为"outer",水平方向上会取得所有Series或者Dataframe索引的并集,
在这里插入图片描述
当axis参数取值为1, join参数的值为inner时,此时取得的是多个Series和Dataframe横向索引的交集,
在这里插入图片描述

concat方法join_axes参数和key参数

join_axes参数可以指定在哪些轴上进行连接,
在这里插入图片描述
指定在a、c、b、e这四个轴上进行合并,实际上s1和s4都不具有b、e两个横向索引,所以对应的地方合并结果为空。

在axis=0,即竖直方向合并的时候,如果要被合并的Series或者Dataframe之间有相同的索引合并后无法区分时候,可以使用 keys参数进行区分,key参数传入的是Python的list。当axis参数为1,水平方向进行合并时,key参数变为合并后各个列名,
在这里插入图片描述
在这里插入图片描述
这里实际上得到的是一个多层索引结构的Series,对于得到的多层索引Series,可以使用unstack方法将其转变为一个Dataframe,
在这里插入图片描述
两个Dataframe水平方向合并的时候,keys参数的设定最终形成的是多层的列名,
在这里插入图片描述
在这里插入图片描述

concat方法ignore_index参数

ignore_index参数默认情况下尾False,即在合并的时候考虑目前Dataframe的索引,可以设置ignore_index为True,此时会忽略索引值进行合并,
在这里插入图片描述
ignore_index参数设置为True,
在这里插入图片描述

4. 合并重叠数据

重叠数据概念

两个数据有数据的公共部分,两个数据可能各有缺失,但是相互之间可以相互填补空缺值,此时可以看做是合并重叠数据。

使用numpy.where方法处理Series对象

两个Series之间或者两个Dataframe之间有部分的相同索引,只想合并重叠的数据时可以使用numpy的 where方法,numpy的where方法具体可见numpy笔记的第一节,相当于一个三元表达式,具体参数和说明如下,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DataFrame的combine_first方法

但是 numpy的where方法的局限性在与只能对Series进行操作,运用到Dataframe时候就不适用了,pandas中的 combine_first方法能够实现numpy的where方法,同时支持Dataframe之间的重叠数据合并,
在这里插入图片描述
两个Dataframe之间使用非缺失值对另一个中的缺失值进行填补,实际上就是重叠数据的合并,
在这里插入图片描述
在这里插入图片描述