本文同步发表于小弟自架网站:微确幸资讯站
资料範例是索引共有四层(0-3层),分别为['学年', '学期', '学制', '性别']
学年:108, 109
学期:1, 2
学制:"博士班", "硕士班", "大学部"
性别:"女", "男"
先看一下资料在Excel中的显示:
import pandas as pdimport numpy as npyear = [108, 109]semester = [1, 2]academic = ['博士班', '硕士班', '大学部']gender = ['女', '男']index = pd.MultiIndex.from_product([year, semester, academic, gender], names=['学年', '学期', '学制', '性别'])df = pd.DataFrame(np.random.randint(300,size=(24,1)),index=index,columns=["学生人数"])df
输出结果太长,只截图一部份:
多重索引的样子:
df.index
多重索引的名字是FrozenList
df.index.names
FrozenList(['学年', '学期', '学制', '性别'])
# 多重索引第0层,也就是"学年"df.index.get_level_values(0)
Int64Index([108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109,
109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109],
dtype='int64', name='学年')
# 多重索引直接带入"学年",得到第0层的索引df.index.get_level_values('学年')
Int64Index([108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, 109,
109, 109, 109, 109, 109, 109, 109, 109, 109, 109, 109],
dtype='int64', name='学年')
# 多重索引第1层,也就是"学期"df.index.get_level_values(1)
Int64Index([1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
2, 2],
dtype='int64', name='学期')
# 多重索引直接带入"学期",得到第1层的索引df.index.get_level_values('学期')
Int64Index([1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
2, 2],
dtype='int64', name='学期')
以下类推第2层是"学制",第3层是"性别"
多重索引筛选资料
第0层资料,例如108学年资料
df.loc[(108)]#df.loc[108] #中括号裏面没有小括号也可以
第1层资料,例如109学年第2学期资料
df.loc[(109, 2)]
第2、3层资料,就以上小括号裏面再把"学制"和"性别"的值带进去就可以得到。
多重索引更改不同索引层的值
将第0层索引[108, 109]更改为[2019, 2020]
dfcopy = df.copy()dfcopy.index = dfcopy.index.set_levels([2019, 2020] , level=0)dfcopy
输出结果太长,只截图一部份:
将第0层索引[108, 109]及第1层索引[1, 2]分别更改为[2019, 2020]与['one', 'two']
dfcopy = df.copy()dfcopy.index = dfcopy.index.set_levels([[2019, 2020], ['one', 'two']] , level=[0,1])dfcopy
输出结果太长,只截图一部份: