更新时间:2023-01-29 来源:黑马程序员 浏览量:
前面所涉及的Pandas对象都只有一层索引结构(行索引、列索引),又称为单层索引,层次化索引可以理解为单层索引的延伸,即在一个轴方向上具有多层索引。
对于两层索引结构来说,它可以分为内层索引和外层索引。以某些省市的面积表格为例,我们来认识一下什么是层次化索引,具体如图3-6所示。
图3-6 层次化索引图示
在图3-6中,按照从左往右的顺序,位于最左边的一列是省的名称,表示外层索引,位于中间的一列是城市的名称,表示内层索引,位于最右边的一列是面积的大小,表示数据。
Series和DataFrame均可以实现层次化索引,最常见的方式是在构造方法的index参数中传入一个嵌套列表。接下来,以图3-6为例,创建具有两层索引结构的Series和DataFrame对象,具体如下:
(1)创建具有两层索引结构的Series对象,具体代码如下。
In [65]: import numpy as np
import pandas as pd
mulitindex_series = pd.Series([15848,13472,12073.8,
7813,7446,6444,15230,8269],
index=[['河北省','河北省','河北省','河北省',
'河南省','河南省','河南省','河南省'],
['石家庄市','唐山市','邯郸市','秦皇岛市',
'郑州市','开封市','洛阳市','新乡市']])
mulitindex_series
Out[65]:
河北省 石家庄市 15848.0
唐山市 13472.0
邯郸市 12073.8
秦皇岛市 7813.0
河南省 郑州市 7446.0
开封市 6444.0
洛阳市 15230.0
新乡市 8269.0
上述示例中,在使用构造方法创建Series对象时候,index参数接收了一个嵌套列表来设置索引的层级,其中,嵌套的第一个列表会作为外层索引,而嵌套的第二个列表会作为内层索引。
(2)创建具有两层索引结构的DataFrame对象,具体代码如下。
In [66]: import pandas as pd
from pandas import DataFrame, Series
# 占地面积为增加的列索引
mulitindex_df = DataFrame({ ‘占地面积’ :[15848, 13472, 12073.8,
7813, 7446, 6444, 15230, 8269]},
index=[['河北省','河北省','河北省','河北省',
'河南省','河南省','河南省','河南省'],
['石家庄市','唐山市','邯郸市','秦皇岛市',
'郑州市','开封市','洛阳市','新乡市']])
mulitindex_df
Out[66]:
占地面积
河北省 石家庄市 15848.0
唐山市 13472.0
邯郸市 12073.8
秦皇岛市 7813.0
河南省 郑州市 7446.0
开封市 6444.0
洛阳市 15230.0
新乡市 8269.0
使用DataFrame生成层次化索引的方式与Series生成层次化索引的方式大致相同,都是对参数index进行设置。
需要注意的是,在创建层次化索引对象时,嵌套函数中两个列表的长度必须是保持一致的,否则将会出现ValueError错误。
除了使用嵌套列表的方式构造层次化索引以外,还可以通过MultiIndex类的方法构建一个层次化索引。MultiIndex类提供了3种创建层次化索引的方法,具体如下:
◆MultiIndex.from_tuples():将元组列表转换为MultiIndex。
◆MultiIndex.from_arrays():将数组列表转换为MultiIndex。
◆MultiIndex.from_product():从多个集合的笛卡儿乘积中创建一个MultiIndex。
使用上面的任一种方法,都可以返回一个MultiIndex类对象。在MultiIndex类对象中有三个比较重要的属性,分别是levels、labels和names,其中,levels表示每个级别的唯一标签,labels表示每一个索引列中每个元素在levels中对应的第几个元素,names可以设置索引等级名称。