Python 数据重塑和数据透视


重排列表格型数据有多种基础操作。这些操作被称为重塑或透视。

1、使用多层索引进行重塑

多层索引在DataFrame中提供了一种一致性方式用于重排列数据。以下是两个基础操作:

  1. statck(堆叠)该操作会“旋转”或将列中的数据透视到行。
  2. unstack(拆堆)该操作会将行中的数据透视到列。

考虑一个带有字符串数组作为行和列索引的小型DataFrame:

数据重塑,数据透视,多层索引,dataframe,stack方法

在这份数据上使用stack方法会将列透视到行,产生一个新的Series:

数据重塑,数据透视,多层索引,dataframe,stack方法

从一个多层索引序列中,你可以使用unstack方法将数据重排列后放入一个DataFrame中:

数据重塑,数据透视,多层索引,dataframe,stack方法

默认情况下,最内层是已拆堆的(与stack方法一样)。可以传入一个层级序号或名称来拆分一个不同的层级:

数据重塑,数据透视,多层索引,dataframe,stack方法

如果层级中的所有值并未包含于每个子分组中时,拆分可能会引入缺失值:

数据重塑,数据透视,多层索引,dataframe,stack方法

默认情况下,堆叠会过滤出缺失值,因此堆叠拆堆的操作是可逆的:

数据重塑,数据透视,多层索引,dataframe,stack方法

当在DataFrame中拆堆时,被拆堆的层级会变为结果中最低的层级:

数据重塑,数据透视,多层索引,dataframe,stack方法

在调用stack方法时,我们可以指明需要堆叠的轴向名称:

数据重塑,数据透视,多层索引,dataframe,stack方法

2、将“长”透视为“宽”

在数据库和CSV中存储多时间序列的方式就是所谓的长格式或堆叠格式。载入一些示例数据,然后做少量的时间序列规整和其他的数据清洗操作:

数据重塑,数据透视,多层索引,dataframe,stack方法

简单地说,PeriodIndex将year和quarter等列进行联合并生成了一种时间间隔类型:

现在,ldata看起来如下:

数据重塑,数据透视,多层索引,dataframe,stack方法

这种数据即所谓的多时间序列的长格式,或称为具有两个或更多个键的其他观测数据(这里的键是date和item)。表中的每一行表示一个时间点上的单个观测值。

3、将“宽”透视为“长”

在DataFrame中,pivot方法的反操作是pandas.melt。与将一列变换为新的Data Frame中的多列不同,它将多列合并成一列,产生一个新的DataFrame,其长度比输入更长。

数据重塑,数据透视,多层索引,dataframe,stack方法

‘key’列可以作为分组指标,其他列均为数据值。当使用pandas.melt时,必须指明哪些列是分组指标(如果有的话)。

数据重塑,数据透视,多层索引,dataframe,stack方法

使用pivot方法,可以将数据重塑回原先的布局:

数据重塑,数据透视,多层索引,dataframe,stack方法

由于pivot的结果根据作为行标签的列生成了索引,使用reset_index来将数据回移一列:

数据重塑,数据透视,多层索引,dataframe,stack方法

也可以指定列的子集作为值列:

数据重塑,数据透视,多层索引,dataframe,stack方法

pandas.melt的使用也可以无须任何分组指标:

数据重塑,数据透视,多层索引,dataframe,stack方法