手记

第六节 数据合并、重塑

一、合并数据集

1、数据库风格的合并

pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来。SQL或其他关系型数据库的用户对此应该会比较熟悉,因为它实现的就是数据库的join操作。

merge函数的参数:

结果里面c和d以及与之相关的数据消失了。默认情况下,merge做的是“内连接”;结果中的键是交集。其他方式还有"left"、"right"以及"outer"。外连接求取的是键的并集,组合了左连接和右连接的效果

多对多连接产生的是行的笛卡尔积。由于左边的DataFrame有3个"b"行,右边的有2个,所以最终结果中就有6个"b"行

要根据多个键进行合并,传入一个由列名组成的列表即可,结果中会出现哪些键组合取决于所选的合并方式.

对于合并运算需要考虑的最后一个问题是对重复列名的处理,可以重命名轴标签,但merge有一个更实用的suffixes选项,用于指定附加到左右两个DataFrame对象的重叠列名上的字符串:

2、索引上的合并

传入left_index=True或right_index=True(或两个都传)以说明索引应该被用作连接键:

对于层次化数据,索引的合并默认是多键合并:

DataFrame还有一个便捷的join实例方法,它能更为方便地实现按索引合并。它还可用于合并多个带有相同或相似索引的DataFrame对象,但要求没有重叠的列。

DataFrame的join方法默认使用的是左连接,保留左边表的行索.。它还支持再调用的DataFrame的列上,连接传递的DataFrame索引。

对于简单的索引合并,可以向join传入一组DataFrame:

3、轴向连接

另一种数据合并运算也被称作连接(concatenation)、绑定(binding)或堆叠(stacking)。NumPy的concatenation函数可以用NumPy数组来做:

pandas的concat函数参数:

有个问题,参与连接的片段在结果中区分不开。假设你想要在连接轴上创建一个层次化索引。使用keys参数即可达到这个目的:

如果沿着axis=1对Series进行合并,则keys就会成为DataFrame的列头:

如果传入的不是列表而是一个字典,则字典的键就会被当做keys选项的值:

我们可以用names参数命名创建的轴级别:

DataFrame的行索引不包含任何相关数据,在这种情况下,传入ignore_index=True即可:

4、合并重叠数据

还有一种数据组合问题不能用简单的合并(merge)或连接(concatenation)运算来处理。比如说,你可能有索引全部或部分重叠的两个数据集。

NumPy的where函数,它表示一种等价于面向数组的if-else:

Series有一个combine_first方法,实现的也是一样的功能,还带有pandas的数据对齐:

对于DataFrame,combine_first自然也会在列上做同样的事情,因此你可以将其看做:用传递对象中的数据为调用对象的缺失数据“打补丁”:

二、重塑和轴向旋转

有许多用于重新排列表格型数据的基础运算。这些函数也称作重塑(reshape)或轴向旋转(pivot)运算。

1、重塑层次化索引

stack:将数据的列“旋转”为行。

unstack:将数据的行“旋转”为列。

默认情况下,unstack操作的是最内层(stack也是如此)。传入分层级别的编号或名称即可对其它级别进行unstack操作:

在对DataFrame进行unstack操作时,作为旋转轴的级别将会成为结果中的最低级别:

2、将“长格式”旋转为“宽格式”

时间序列数据通常是以所谓的“长格式”(long)或“堆叠格式”(stacked)存储在数据库和CSV中的。

加载一些示例数据,做一些时间序列规整和数据清洗:

这就是多个时间序列(或者其它带有两个或多个键的可观察数据,这里,我们的键是date和item)的长格式。表中的每行代表一次观察。

关系型数据库(如MySQL)中的数据经常都是这样存储的,因为固定架构(即列名和数据类型)有一个好处:随着表中数据的添加,item列中的值的种类能够增加。在前面的例子中,date和item通常就是主键(用关系型数据库的说法),不仅提供了关系完整性,而且提供了更为简单的查询支持。有的情况下,使用这样的数据会很麻烦,你可能会更喜欢DataFrame,不同的item值分别形成一列,date列中的时间戳则用作索引。DataFrame的pivot方法完全可以实现这个转换:

假设有两个需要同时重塑的数据列:

3、将“宽格式”旋转为“长格式”

andas.melt,它不是将一列转换到多个新的DataFrame,而是合并多个列成为一个,产生一个比输入长的DataFrame。使用pandas.melt,我们必须指明哪些列是分组指标。

使用pivot,可以重塑回原来的样子:


pandas.melt也可以不用分组指标:



作者:owolf
链接:https://www.jianshu.com/p/e85cc07e23d6


0人推荐
随时随地看视频
慕课网APP