之前介绍的Series和DataFrame都是单条索引,其实还可以是多级索引。通过多级索引可以很方便的处理多维数据。
注:ser指Series对象,frame指DataFrame对象
1. Series多级索引
>>> ser = pd.Series(np.arange(4), index=[['a', 'a', 'b', 'b'], ['i1', 'i2', 'i3']])
>>> ser
a i1 0
i2 1
b i3 2
i4 3
dtype: int32
可以看出,index为2维数组,数组元素为列元素个数,相关操作如下,和二维数组使用方式类似:
ser['a','i1'] //对元素进行操作
ser['a']
ser[:,'i1']
2.DataFrame多级索引
(1)可以通过unstack和stack函数让二级索引的Series和DataFrame相互转换
>>> frame = ser.unstack()
>>> frame
i1 i2 i3 i4
a 0.0 1.0 NaN NaN
b NaN NaN 2.0 3.0
>>> frame.stack()
a i1 0.0
i2 1.0
b i3 2.0
i4 3.0
dtype: float64
(2)DataFrame可以同时将columns和index都设置为二级索引
>>> frame = pd.DataFrame(np.arange(4).reshape(2,2), index=[['a', 'b'], ['c', 'd'
]], columns=[['c1', 'c2'], ['c3', 'c4']])
>>> frame
c1 c2
c3 c4
a c 0 1
b d 2 3
3.调整层级顺序
通过swaplevel可以修改层级顺序,但先要给层级索引命名
>>> frame.index.names = ['colors', 'status']
>>> frame
c1 c2
c3 c4
colors status
a c 0 1
b d 2 3
>>> frame.swaplevel('status', 'colors')
c1 c2
c3 c4
status colors
c a 0 1
d b 2 3
>>>
命名后,将status索引列放在前面,colors列放在后面就完成交换了,同时元素内容不变
4.按层级统计数据
frame.sum(level='colors') //对index列colors统计数据
frame.sum(level='id', axis=1) //对columns列进行统计