在许多应用中,数据可能分散在许多文件或数据库中,存储的形式也不利于分析,应采用聚合、合并、重塑数据的方法进行处理。
层次化索引
层次化索引(hierarchical indexing)是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别。
“内层”中进行选取
unstack的逆运算是stack
对于一个DataFrame,每条轴都可以有分层索引
有了部分列索引,因此可以轻松选取列分组
重排与分级排序
调整某条轴上各级别的顺序
而sort_index则根据单个级别中的值对数据进行排序。交换级别时,常常也会用到 sort_index,这样最终结果就是按照指定顺序进行字母排序了。
根据级别汇总统计
对DataFrame和Series的描述和汇总统计都有一个level选项,它用于指定在某条轴上求和的级别。
使用DataFrame的列进行索引
将DataFrame的一个或多个列当做行索引来用,或者可能希望将行索引变成DataFrame的列
默认情况下,那些列会从DataFrame中移除,但也可以将其保留下来(drop=False)
reset_index的功能跟set_index刚好相反,层次化索引的级别会被转移到列里面
合并数据集
pandas对象中的数据可以通过一些方式进行合并
pandas.merge可根据一个或多个键将不同DataFrame中的行连接起来。SQL或其他关系型数据库的用户对此应该会比较熟悉,因为它实现的就是数据库的join操作。
pandas.concat可以沿着一条轴将多个对象堆叠到一起。
实例方法combine_first可以将重复数据拼接在一起,用一个对象中的值填充另一个对象中的缺失值。
数据库风格的DataFrame合并
数据集的合并(merge)或连接(join)运算是通过一个或多个键将行连接起来的。
这是一种多对一的合并
没有指明要用哪个列进行连接。如果没有指定,merge就会将重叠列的列名当做键。最好明确指定一下。
如果两个对象的列名不同,也可以分别进行指定。
结果里面c和d以及与之相关的数据消失了。默认情况下,merge做的是“内连接”;结果中的键是交集。其他方式还有”left”、”right”以及”outer”。外连接求取的是键的并集,组合了左连接和右连接的效果。连接方式
多表连接选项及说明
选项 | 说明 |
---|---|
inner | 使用两个表中共同拥有的键 |
left | 使用左表中所有的键 |
right | 使用右表中所有的键 |
outer | 使用两个表中所有的键 |
多对多的合并
多对多连接,由于左边的DataFrame有3个”b”行,右边的有2个,所以最终结果中就有6 个”b”。
根据多个键进行合并
重复列名的处理
索引上的合并
连接键位于其索引中。在这种情况下,你可以传入left_index=True或right_index=True(或两个都传)以说明索引应该被用作连接键。
层次化索引的数据, 索引的合并默认是多键合并
必须以列表的形式指明用作合并键的多个列(注意用how=‘outer’对重复索引值的处理)
同时使用合并双方的索引
join实例方法,能实现按索引合并
向join传入一组DataFrame
轴向连接
数据合并运算也被称作连接(concatenation)、绑定(binding)或堆叠(stacking)
pandas的concat函数合并操作
调用concat可以将值和索引粘合在一起
传入axis=1,则结果就会变成一个DataFrame(axis=1是列)
参与连接的片段在结果中区分不开。假设你想要在连接轴上创建一个层次化索引。使用keys参数即可达到这个目的。
如果沿着axis=1对Series进行合并,则keys就会成为DataFrame的列头。
用names参数命名创建的轴级别
DataFrame的行索引不包含任何相关数据, 传入ignore_index=True
合并重叠数据
索引全部或部分重叠的两个数据集
此语句实现一样的功能
对于DataFrame,combine_first自然也会在列上做同样的事情,因此你可以将其看做:用传递对象中的数据为调用对象的缺失数据“打补丁”。
重塑和轴向旋转
用于重新排列表格型数据的基础运算。这些函数也称作重塑(reshape)或轴向旋转(pivot) 运算。
重塑层次化索引
stack:将数据的列“旋转”为行u
nstack:将数据的行“旋转”为列
对该数据使用stack方法即可将列转换为行,得到一个Series。
对于一个层次化索引的Series,你可以用unstack将其重排为一个DataFrame:
默认情况下,unstack操作的是最内层(stack也是如此)。传入分层级别的编号或名称即可对其它级别进行unstack操作。
将“长格式”旋转为“宽格式”
多个时间序列数据通常是以所谓的“长格式”(long)或“堆叠格式”(stacked)存储在数据库和CSV中的。我们先加载一些示例数据,做一些时间序列规整和数据清洗。
不同的item值分别形成一列,date列中的时间戳则用作索引
如果忽略最后一个参数,得到的DataFrame就会带有层次化的列
将“宽格式”旋转为“长格式”
当使用pandas.melt,我们必须指明哪些列是分组指标。下面使用key作为唯一的分组指标。
使用pivot,可以重塑回原来的样子
因为pivot的结果从列创建了一个索引,用作行标签,我们可以使用reset_index将数据移回列
指定列的子集,作为值的列
pandas.melt也可以不用分组指标