一、合并数据集
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