这篇教程pandas多层索引的创建和取值以及排序的实现写得很实用,希望能帮到您。 多层索引的创建
普通-多个index创建
- 在创建数据的时候加入一个index列表,这个index列表里面是多个索引列表
Series多层索引的创建方法
import pandas as pds = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李四','李四','王五','王五'], ['期中','期末','期中','期末','期中','期末']])# print(s)s 张三 期中 1 期末 2 李四 期中 3 期末 4 王五 期中 5 期末 6 dtype: int64
利用 numpy中的随机数
import numpy as npdata = np.random.randint(0,100,size=(6,3))# np.random.randint(0,100,size=(6,3))是使用numpy中的随机模块random中,生成随机整数方法randint,# 里面的参数size是指定生成6行3列的数据,并且每个数字的范围在0到100之间data array([[44, 66, 67], [82, 52, 0], [34, 78, 23], [38, 4, 43], [60, 62, 40], [57, 9, 11]]) Dataframe多层索引创建
import pandas as pdimport numpy as npdata = np.random.randint(0,100,size=(6,3))df = pd.DataFrame(data,index=[['张三','张三','李四','李四','王五','王五'], ['期中','期末','期中','期末','期中','期末']], columns=['Java','Web','Python'])df | Java | Web | Python | 张三 | 期中 | 68 | 4 | 90 | 期末 | 33 | 63 | 73 | 李四 | 期中 | 30 | 13 | 68 | 期末 | 14 | 18 | 48 | 王五 | 期中 | 34 | 66 | 26 | 期末 | 89 | 10 | 35 | 简化创建-from_product()
import pandas as pdimport numpy as npdata = 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)df | Java | Web | Python | 张三 | 期中 | 51 | 78 | 47 | 期末 | 39 | 53 | 36 | 李四 | 期中 | 33 | 60 | 83 | 期末 | 90 | 55 | 3 | 王五 | 期中 | 37 | 45 | 66 | 期末 | 6 | 82 | 71 | from_product()在这个里面的列表中位置不同, 产生的索引页会不同
index = pd.MultiIndex.from_product([exam, names])df = pd.DataFrame(data,index=index,columns=['Java','Web','Python'])# print(df)df | Java | Web | Python | 期中 | 张三 | 51 | 78 | 47 | 李四 | 39 | 53 | 36 | 王五 | 33 | 60 | 83 | 期末 | 张三 | 90 | 55 | 3 | 李四 | 37 | 45 | 66 | 王五 | 6 | 82 | 71 | from_product([exam,names])会将列表中第一个元素作为最外层索引,依次类推
多层索引的取值
获取到我们想要的数据 获取多层索引Series中的数据
创建数据 import pandas as pds = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李四','李四','王五','王五'], ['期中','期末','期中','期末','期中','期末']])print(s) 张三 期中 1 期末 2 李四 期中 3 期末 4 王五 期中 5 期末 6 dtype: int64
可以直接使用[]的方式取最外面的一个层级 s[‘张三'] s['李四']# 注意:[]取值方式,不可直接使用最外层以外的其他层级,例如:s['期末'] 期中 3 期末 4 dtype: int64
使用['外索引', '内索引'], 获取某个数据
注意:[‘张三',‘期末']他们的顺序不能变。剥洋葱原则,从外到内一层一层的剥。 s['李四', '期中'] # 李四期中分值# 注意:['张三','期末']他们的顺序不能变。剥洋葱原则,从外到内一层一层的剥。 3 使用[]的切片,获取数据s[:,‘期中'] 张三 1 李四 3 王五 5 dtype: int64
使用 loc
- loc 使用的是标签suoyin
- iloc使用的是位置索引
# loc 使用方式与 [] 的方式基本一样s.loc['张三']s.loc['张三','期中']s.loc[:,'期中']# iloc 的取值并不会受多层索引影响,只会根据数据的位置索引进行取值, 不推荐 张三 1 李四 3 王五 5 dtype: int64
多层索引DataFrame的取值
在对多层索引DataFrame的取值是,推荐使用 loc() 函数
import pandas as pdimport numpy as np#size参数是指定生成6行3列的数组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'])df | Java | Web | Python | 张三 | 期中 | 3 | 40 | 52 | 期末 | 74 | 38 | 85 | 李四 | 期中 | 7 | 28 | 16 | 期末 | 9 | 25 | 0 | 王五 | 期中 | 13 | 24 | 8 | 期末 | 49 | 46 | 1 | 三种方式都可以获取张三期中各科成绩 # df.loc['张三','期中']# df.loc['张三'].loc['期中']# df.loc[('张三','期中')] 注意:DataFrame中对行索引的时候和Series有一个同样的注意点,就是无法直接对二级索引直接进行索引,必须让二级索引变成一级索引后才能对其进行索引 多层索引的排序 - 使用sort_index() 排序
- level参数可以指定是否按照指定的层级进行排列
- 第一层索引值为0, 第二层索引的值为1
创建数据
import pandas as pddata = 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'])df | | Java | Web | Python | b | 2 | 56 | 82 | 81 | 1 | 84 | 16 | 55 | 3 | 35 | 25 | 86 | c | 2 | 76 | 1 | 76 | 1 | 36 | 28 | 94 | 3 | 79 | 70 | 97 | a | 2 | 25 | 17 | 30 | 1 | 38 | 38 | 78 | 3 | 41 | 75 | 90 | 排序
- DataFrame按行索引排序的方法是sort_index()
- 如果直接使用的话,不传参数, 会把每一层索引根据值进行升序排序
| Java | Web | Python | a | 1 | 18 | 60 | 74 | 2 | 66 | 87 | 27 | 3 | 96 | 18 | 64 | b | 1 | 72 | 58 | 52 | 2 | 22 | 31 | 22 | 3 | 31 | 12 | 83 | c | 1 | 6 | 54 | 96 | 2 | 9 | 47 | 18 | 3 | 31 | 63 | 4 | # 当level=0时,ascending=False, 会根据第一层索引值进行降序排序df.sort_index(level=0,ascending=False) | Java | Web | Python | c | 3 | 79 | 70 | 97 | 2 | 76 | 1 | 76 | 1 | 36 | 28 | 94 | b | 3 | 35 | 25 | 86 | 2 | 56 | 82 | 81 | 1 | 84 | 16 | 55 | a | 3 | 41 | 75 | 90 | 2 | 25 | 17 | 30 | 1 | 38 | 38 | 78 | # 当level=1时,会根据第二层索引值进行降序排序df.sort_index(level=1,ascending=False)# 数据会根据第二层索引值进行相应的降序排列,# 如果索引值相同时会根据其他层索引值排列 | Java | Web | Python | c | 3 | 79 | 70 | 97 | b | 3 | 35 | 25 | 86 | a | 3 | 41 | 75 | 90 | c | 2 | 76 | 1 | 76 | b | 2 | 56 | 82 | 81 | a | 2 | 25 | 17 | 30 | c | 1 | 36 | 28 | 94 | b | 1 | 84 | 16 | 55 | a | 1 | 38 | 38 | 78 | 通过level设置排序的索引层级,其他层索引也会根据其排序规则进行排序 到此这篇关于pandas多层索引的创建和取值以及排序的实现的文章就介绍到这了,更多相关pandas多层索引内容请搜索51zixue.net以前的文章或继续浏览下面的相关文章希望大家以后多多支持51zixue.net! Python 并列和或者条件的使用说明 Python jieba 中文分词与词频统计的操作 |