目标:

学会多层索引的创建

学会多层索引的取值

学会多层索引的排序

一、多层索引的创建

1、给Series创建索引

① ⽅式⼀:直接使⽤index参数创建 在使⽤index参数时,index的值是⼀个列表,其中的元素是多个列表,每个列表就是⼀层索 引,举个栗⼦:

import pandas as pd

# 创建Series索引

s = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李四','李四','王五','王 五'], ['期中','期末','期中','期末','期中','期 末']])

print(s)

image.png

我们来看⼀下输出结果:第⼀列的张三、李四、王五是第⼀层的索引,第⼆层的期中、期末是 第⼆层的索引。第三列的就是对应的数据

这种建索引的⽅式写起来很麻烦,我们要写很多重复的内容,所以pandas给我们提供了另⼀ 种⽅式(MultiIndex.from_product() )来构建多层索引

②⽅式⼆:使⽤MultiIndex.from_product()方法构建 ⾸先我们把每层需要的索引写⼊到⼀个列表中,将这些列表在存⼊到⼀个新的列表当中,作为 参数传⼊MultiIndex.from_product()方法中,把结果赋值给变量index,那么这个index就 是我们构造好的索引,我们只需要在创建Series的时候传入索引即可

names = ['张三','李四','王五']

exam = ['期中','期末']

index = pd.MultiIndex.from_product([names,exam])

s = pd.Series([1,2,3,4,5,6],index=index)

print(s)

image.png

2、给dataframe创建索引

①⽅式⼀:直接使⽤index参数创建 与Series创建索引的⽅法类似,同样是加了⼀个参数,但是因为这⾥是⼆维的数据,所以添加 ⾏索引后还需要添加列索引,那么我们就需要在增加⼀个参数 columns来表示列索引,举个栗⼦:

import numpy as np

data = np.random.randint(0, 100, size=(6, 3))

df = pd.DataFrame(data, index=[['张三', '张三', '李四', '李四', '王五', '王五'], ['期中', '期末', '期中', '期末', '期中', '期 末']], columns=['Java', 'Web', 'Python'])

print(df)

image.png

② ⽅式⼆:使⽤MultiIndex.from_product()方法构建

data = np.random.randint(0, 100, size=(6, 3))

names = ['张三', '李四', '王五']

exam = ['期中', '期末']

index = pd.MultiIndex.from_product([names, exam])

df = pd.DataFrame(data, index=index, columns=['Java', 'Web', 'Python'])

print(df)

image.png

与Series⼀样,Dataframe也可以利⽤MultiIndex.from_product()方法来创建索引,用法是 一样的

3、索引的顺序不同,⽣成的数据也是不⼀样的,我们可以将上⾯的两个索引顺序颠倒以下来看⼀ 下输出结果

index = pd.MultiIndex.from_product([exam,names])

df = pd.DataFrame(data, index=index, columns=['Java', 'Web', 'Python'])

print(df)

可以看出期中、期末变成了第⼀层索引,姓名变成了第⼆层索引 在实际应⽤中,我们可以根据⾃⼰的需求来创建索引

二、根据索引提取数据

与字典的结构类似,我们可以⽤索引来逐层的提取数据,

1.提取Series数据

①使⽤[]提取

s = pd.Series([1,2,3,4,5,6],index=[['张三er','张三','李wu','李四','王五','王 五'], ['期中','期末','期中','期末','期中','期 末']])

res = s['张三','期末']

print(res)

结果:2

我们还可以利⽤loc和iloc来提取数据

②使⽤loc提取数据

loc提取数据的⽅式与使⽤中括号 []差不多

s = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李wu','李四','王五','王 五'], ['期中','期末','期中','期末','期中','期 末']])

res1 = s.loc['张三']

print(res1)

image.png

③使⽤多层索引提取数据

res2 = s.loc['张三','期中']

print(2,res2)

res3 = s.loc['张三'].loc['期中']

print(3,res3)

res4 = s.loc[:,'期中']

print(4,res4)

image.png

总结以下loc的使⽤⽅式(获取张三的期中成绩):

s = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李wu','李四','王五','王 五'], ['期中','期末','期中','期末','期中','期 末']])

res2 = s.loc['张三','期中']

print(res2)

res3 = s.loc['张三'].loc['期中']

print(res3)

res5 = s.loc[('张三','期中')]

print(res5)

④使⽤iloc提取数据

iloc与loc的区别是iloc是利⽤的位置索引

res7 = s.iloc[0]

print(res7)

结果:1

三、排序

sort_index()⽅法

level=0 表示按照第⼀层索引进⾏排序,默认为0,为1表示优先按照第⼆层索引 ...

ascending=False 表示从⼤到⼩进⾏排列,默认为True(从⼩到⼤排序)

data = np.random.randint(0,100,size=(9,3))

key1 = ['b','c','a']

key2 = [2,1,3]

index = pd.MultiIndex.from_product([key1,key2])

df = pd.DataFrame(data,index=index,columns=['Java','Web','Python'])

res1 = df.sort_index()

res2 = df.sort_index(level=0,ascending=False)

print(df)

print('----------------------------')

print(res1)

print('----------------------------')

print(res2)

image.png

我们来看⼀下按照第⼆层索引排序的情况

data = np.random.randint(0,100,size=(9,3))

key1 = ['b','c','a']

key2 = [2,1,3]

index = pd.MultiIndex.from_product([key1,key2])

df = pd.DataFrame(data,index=index,columns=['Java','Web','Python'])

res1 = df.sort_index()

res2 = df.sort_index(level=1,ascending=False)

print(df)

print('----------------------------')

print(res1)

print('----------------------------')

print(res2)

image.png

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐