学科分类
目录
数据分析

重塑层次化索引

在Pandas中,大多数据是以便于操作的DataFrame形式展现的,这样可以很容易地获取每行或每列的数据。不过有些时候,需要将DataFrame对象转换为Series对象。为此,Pandas提供了数据重塑的一些功能,包括重塑层次化索引和轴向转换,用于转换一个表格或向量的结构,使其更便于进行下一步的分析。

Pandas中重塑层次化索引的操作主要是stack()方法和unstack()方法,前者是将数据的列“旋转”为行,后者是将数据的行“旋转”为列。

stack()方法可以将数据的列索引转换为行索引,其语法格式如下:

DataFrame.stack(level=-1, dropna=True)

上述方法中部分参数表示的含义如下:

(1) level:表示操作内层索引。若设为0,表示操作外层索引,默认为-1。

(2) dropna:表示是否将旋转后的缺失值删除,若设为True,则表示自动过滤缺失值,设置为False则相反。

假设现在有一个DataFrame类对象df,它只有单层索引,如果希望将其重塑为一个具有两层索引结构的对象result,也就是说将列索引转换成内层行索引,则重塑前后的效果如图1所示。

img

图1 DataFrame对象重塑为Series对象

接下来,我们通过一个示例来演示如何使用stack()方法将df对象旋转成result,具体代码如下:

In [33]: import pandas as pd
         df = pd.DataFrame({'A':['A0','A1','A2'],'B':['B0','B1','B2']})
         # 将df进行重塑
         result = df.stack()
         result
Out[33]:
0 A  A0
  B  B0
1 A  A1
  B  B1
2 A  A2
  B  B2

上述代码中,首先创建了一个DataFrame类的对象df,然后让df对象调用stack()方法进行重塑,表明df对象的列索引会转换成行索引。从输出结果看出,result对象具有两层行索引。

使用type()函数来查看result的类型,代码如下:

In [34]: type(result)
Out[34]: pandas.core.series.Series

从输出结果可以看出,DataFrame对象已经被转换成了一个Series对象。

unstack()方法可以将数据的行索引转换为列索引,其语法格式如下:

DataFrame.unstack(level=-1, fill_value=None)

上述方法中部分参数表示的含义如下:

(1) level:默认为-1,表示操作内层索引,0表示操作外层索引。

(2) fill_value:若产生了缺失值,则可以设置这个参数用来替换NaN。

接下来,将前面示例中重塑的Series对象“恢复原样”,转变成DataFrame对象,具体代码如下:

In [35]: import pandas as pd
         df = pd.DataFrame({'A':['A0','A1','A2'],'B':['B0','B1','B2']})
         res = df.stack() # 将df重塑为Series对象
         res.unstack()    # 将Series对象转换成df

Out[35]:
​      A  B
​    0 A0 B0
​    1 A1 B1
​    2 A2 B2

上述示例中,首先创建了一个DataFrame类对象df,然后使用stack()方法将其重塑为Series类对象,最后再使用unstack()方法将其重塑回DataFrame类对象。

除此之外,stack()与unstack()方法还可以在多层索引对象中使用,如图2所示为一个多层索引的DataFrame对象经过旋转后的效果。

img

图2 多层索引的重塑

接下来,我们通过一个示例来演示层级索引对象如何使用stack()方法进行旋转,具体代码如下:

In [36]: import pandas as pd
         import numpy as np
         df = pd.DataFrame(np.array([[26,20,22,26],[30,25,24,20]]),
                           index=['男生人数','女生人数'],
                           columns=[['一楼','一楼','二楼','二楼'],
                                    ['A教室','B教室','A教室','B教室']])
         df.stack()

Out[36]:
             一楼 二楼
男生人数  A教室 26  22
        B教室 20  26
女生人数  A教室 30  24
         B教室 25  20

在上述代码中首先创建了一个具有层级索引的DataFrame类型对象,然后让该对象执行stack()方法,经旋转后生成一个如图2重塑后的对象,使用type函数查看该对象类型为DataFrame,所以当一个具有层级索引的DataFrame对象旋转后其对象类型仍为DataFrame类型。

层级索引的重塑操作默认是对内层索引进行旋转,当需要对层级索引的最外层索引进行旋转时,需要将stack()方法中leve参数的值设置为0即可。如图3所示就是旋转最外层索引的效果。

img

图3 多层索引重塑

接下来,我们通过一个示例来演示层级索引对象如何使用stack()方法对最外层索引进行旋转,具体代码如下:

In [37]: df.stack(level=0)  # 旋转外层索引
Out[37]:
​             A教室 B教室
男生人数  一楼  26    20
​       二楼  22    26
女生人数  一楼  30    25
​       二楼   24    20
点击此处
隐藏目录