您的当前位置:首页正文

Pandas(数据规整:聚合、合并和重塑)

来源:要发发知识网

在许多应用中,数据可能分散在许多文件或数据库中,存储的形式也不利于分析,应采用聚合、合并、重塑数据的方法进行处理。

层次化索引

层次化索引(hierarchical indexing)是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别。

层次化索引 根据索引取内容

“内层”中进行选取

内层选取

unstack的逆运算是stack

stack

对于一个DataFrame,每条轴都可以有分层索引

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就会将重叠列的列名当做键。最好明确指定一下。

明确连接键

如果两个对象的列名不同,也可以分别进行指定。

列名不同分别指定 外连接

多表连接选项及说明

选项 说明
inner 使用两个表中共同拥有的键
left 使用左表中所有的键
right 使用右表中所有的键
outer 使用两个表中所有的键

多对多的合并

左连接的合并方式

多对多连接,由于左边的DataFrame有3个”b”行,右边的有2个,所以最终结果中就有6 个”b”。

内连接

根据多个键进行合并

多键全连接

重复列名的处理

处理重复列名

索引上的合并

连接键位于其索引中。在这种情况下,你可以传入left_index=True或right_index=True(或两个都传)以说明索引应该被用作连接键。

索引做连接键

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

数据准备

必须以列表的形式指明用作合并键的多个列(注意用how=‘outer’对重复索引值的处理)

全连接处理重复索引

同时使用合并双方的索引

使用双方索引

join实例方法,能实现按索引合并

索引合并

向join传入一组DataFrame

传入DataFrame

轴向连接

数据合并运算也被称作连接(concatenation)、绑定(binding)或堆叠(stacking)

连接实例

pandas的concat函数合并操作

数据准备

调用concat可以将值和索引粘合在一起

索引粘合

传入axis=1,则结果就会变成一个DataFrame(axis=1是列)

传参粘合 指定连接后显示的内容

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

创建层次化索引

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

keys的应用 多层应用

用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也可以不用分组指标

缺省分组指标