一、层次化索引:
在一个轴上拥有多个索引(两个及以上),它使得我们能以低纬度形式处理高纬度数据。层次化索引在数据重塑和基于分组的操作(透视表的生成)中扮演重要角色。
简单的说,层次化索引就是轴上有多个级别的索引。
二、带层次化索引的Series数组对象
1、创建带层次化索引的Series数组对象
import pandas as pd
import numpy as np
data = pd.Series(np.random.randint(1,10,10),index=[['a','a','a','b','b','b','c','c','c','c'], \
[1,2,3,1,2,3,1,2,3,4]],name = '随机整数')
data
out:
# 设置每一级索引的名称
data.index.names=['class1','class2']
data
# 查看Series的索引
data.index
levels
:每个级别的标签去重后的数组
labels
:以整数来表示每个level上标签的位置
names
:每个级别索引的名字
MultiIndex(levels=[['a', 'b', 'c'], [1, 2, 3, 4]],
labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2, 3]],
names=['class1', 'class2'])
2、利用层次化索引进行查询
- 通过一级索引进行数据查询
# 通过一级索引进行查询
data['a']
- 通过二级索引进行数据查询
# 通过二级索引进行查询
data[:,2]
- 通过两级索引共同进行数据查询
data['a',2]
# 输出9
3、数据的重塑 pd.unstack()
'''
Series.unstack(level=-1, fill_value=None)
参数说明:
level:默认-1,按照最后一级的列索引,将列数据变成行数据
fill_value:若有缺失值,可选择填充字符
函数作用:将数据的行“旋转”为列
'''
# Series.unstack(level=-1, fill_value=None)
data.unstack()
重塑前:
一维数组,只有一行数据
重塑后:
行数据变成了列数据,因为一级索引a、b 与 二级索引4对应的地方无数据,所以显示成缺失值NaN
注意:此时是一个三行四列的二维数组DataFrame!!!
填补缺失值为0
data.unstack(fill_value = 0)
指定按照一级索引(最外面一层索引)进行数据重塑
data.unstack(level=0,fill_value=0)
对应的使用stack()即可将列数据转换成行数据
data.unstack(level=0,fill_value=0).stack()
三、带层次化索引的DataFrame数组对象
1、创建带层次化索引的DataFrame数组对象
准备数据
import os
# 如果路径名包含中文,那么read_csv无法读取到文件,可先使用os.chdir。
os.chdir('E:\学习文档\data')
book_data = pd.read_csv("books.csv",encoding='gbk',sep=',',dtype={'original_publication_year':str} \
,usecols =['isbn','authors','original_publication_year','language_code','books_count','ratings_count'])
book_data.head()
# 查看数据相关基础信息
book_data.info()
# 设置多层行索引
book_data.set_index(['original_publication_year','language_code'],inplace =True)
book_data.head()
效果如下:
查看行索引:
book_data.index
可以看出行索引是多重索引:
设置多层列索引前:
设置多层索引:
book_data.columns=[['base_info','base_info','count_info','count_info'],['isbn','authors','books_count','ratings_count']]
book_data.head()
设置多层列索引后:
可以设置一下不同级别的列索引的名称
book_data.columns.names = ['info','detail']
2、利用层次化索引进行查询
- 通过第一层行索引检索数据
# 通过第一层行索引检索数据
book_data.loc['2008'].head()
- 通过多层行索引检索数据
(多层索引,要以元组形式进行查询)
book_data.loc[('2008','eng')].head()
- 通过第一层列索引检索数据
book_data['base_info'].head()
- 通过第二层列索引检索数据
book_data['isbn'].head()
报错:KeyError: ‘isbn’
要与第一层列索引一起使用
book_data['base_info','isbn'].head()
另外一种写法
book_data.loc[:,('base_info','isbn')].head()
四、重排分级数据
交换行索引级别
'''
swaplevel(i=-2, j=-1, axis=0)
i,j:要交换分级顺序的索引的下标
'''
book_data.swaplevel().head()
交换列索引级别
book_data.swaplevel(i=-2, j=-1,axis=1).head()
'''book_data.sortlevel(level=0, axis=0, ascending=True, inplace=False, sort_remaining=True)'''
book_data.swaplevel(i=-2, j=-1,axis=1).sortlevel(0,axis = 0,ascending=False)
# book_data.sort_index(level = 0,axis = 0,ascending=False)
# 效果相同
如果索引是按字典方式,从外到内排序,调用sortlevel(0)或者sort_index()