多层索引是Pandas中一个比较核心的概念,允许你在一个轴向上拥有多个索引层级,许多同学不能处理复杂的数据,最大的问题在于没法灵活的处理多层索引。
而gruopby()方法可以生成带有多层索引的结果。
一、多层索引的创建
我们先看看Series多层索引的创建方法。
import pandas as pd
se = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李四','李四','王五','王五'],
['期中','期末','期中','期末','期中','期末']])
se
张三 期中 1
期末 2
李四 期中 3
期末 4
王五 期中 5
期末 6
dtype: int64
张三那一列是数据的第一层索引,期中那一列是数据的第二层索引,而第二层索引值是和数据一一对应的。
我们在创建的时候发现,也需要将名字和考试阶段一一对应,才可以。如下所示:
现在,我们将数据增加几个科目的成绩,演示DataFrame多层索引的创建方法。由于成绩的数据比较多,我们将使用numpy的随机数方法构建成绩数据。
import numpy as np
data = np.random.randint(0,100,size=(6,3))
data
array([[77, 71, 4],
[82, 81, 77],
[75, 67, 52],
[53, 84, 53],
[86, 95, 10],
[92, 34, 48]])
np.random.randint(0,100,size=(6,3))是使用numpy中的随机模块random中,生成随机整数方法randint,里面的参数size是指定生成6行3列的数据,并且每个数字的范围在0到100之间。
现在,我们知道了实验数据如何创建,下面我们根据Series的创建方法创建多层索引的DataFrame。
import pandas as pd
import numpy as np
data = np.random.randint(0,100,size=(6,3))
df = pd.DataFrame(data=data,index=[['张三','张三','李四','李四','王五','王五'],
['期中','期末','期中','期末','期中','期末']],
columns=['Jave','Web','Python'])
df
Jave | Web | Python | ||
---|---|---|---|---|
张三 | 期中 | 23 | 9 | 35 |
期末 | 38 | 6 | 10 | |
李四 | 期中 | 39 | 54 | 51 |
期末 | 57 | 54 | 19 | |
王五 | 期中 | 84 | 33 | 17 |
期末 | 19 | 91 | 39 |
我们虽然成功的创建了DataFrame的多层索引,但是有一个问题,在设置索引的时候会有很多重复的索引值,如何才能简化索引的写法呢?
Pandas为了解决这个问题,提供了一个创建多层索引的构造方法。
**pd.MultiIndex.from_product()**构建索引的方式,对我们来说会好理解一些。
首先,确定每一层索引的值什么,然后以列表的形势传给from_product()方法即可。
import pandas as pd
import numpy as np
data = np.random.randint(0,100,size=(8,3))
names