pandas多层索引的创建和取值以及排序的实现
作者:蓝小白1024 发布时间:2023-07-09 23:12:54
多层索引的创建
普通-多个index创建
在创建数据的时候加入一个index列表,这个index列表里面是多个索引列表
Series多层索引的创建方法
import pandas as pd
s = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李四','李四','王五','王五'],
['期中','期末','期中','期末','期中','期末']])
# print(s)
s
张三 期中 1
期末 2
李四 期中 3
期末 4
王五 期中 5
期末 6
dtype: int64
利用 numpy中的随机数
import numpy as np
data = 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 pd
import numpy as np
data = 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 pd
import numpy as np
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)
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 pd
s = 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[:,‘期中']
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 pd
import 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 pd
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'])
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()
如果直接使用的话,不传参数, 会把每一层索引根据值进行升序排序
df.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设置排序的索引层级,其他层索引也会根据其排序规则进行排序
来源:https://blog.csdn.net/lxb_wyf/article/details/114273989
猜你喜欢
- 前言django提供了commands类,允许我们编写命令行脚本,并且可以通过python manage.py拉起。了解commands具体
- 一、背景我们在进行代码调试时,通常使用两种方式。print 输出调试的内容或者标识通过断点调试debug但是我想知道代码的中间的每一行程序运
- The WeekdayName function returns the weekday name of a specified day o
- 1、说明tqdm是一个方便且易于扩展的Python进度条,可以在python执行长循环时在命令行界面实时地显示一个进度提示信息,包括执行进度
- 一、数据可视化1.pyecharts介绍官方网址:https://pyecharts.org/#/zh-cn/intro📣 概况:Echar
- CSS3草案中定义了{opacity:来声明元素的透明度,这已经得到了大多数现代浏览器的支持,而IE则很早通过特定的私有属性filter来实
- 这篇文章主要介绍了python sorted方法和列表使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 介绍PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、
- Matplotlib简述:Matplotlib是一个用于创建出高质量图表的桌面绘图包(主要是2D方面)。该项目是由JohnHunter于20
- 最近在研究品牌如何演绎,当然,看的时候没有忘记本行,分析了一下他们的交互设计~~路易威登LV上图采用胶片展示多组信息——大片展示品牌渲染。利
- 本文实例讲述了常规方法实现python数组的全排列操作。分享给大家供大家参考。具体分析如下:全排列解释:从n个不同元素中任取m(m≤n)个元
- 本人虽然五音不全,但是听歌还是很喜欢的。希望能利用机器自动制作音乐,本我发现了一个比较适合入门的有趣的开源音乐生成模块 PySynth ,文
- 对象Javascript 根本上是和对象相关的。数组是对象。函数是对象。对象是对象。那什么是对象呢?对象是名-值对的集合。名是字符串,值可以
- 这篇文章主要介绍了Python文件操作函数用法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 这两个字符串真实长度和取固定长度的字符串函数是在 photo.163.com 的js文件里看到的。 作者&nb
- Terminal终端命令行Shell设置解决方案File --> Settings --> Tools --> Termi
- 一、读取Excel中的数据安装xlrd 只能读取Excel内容pip install xlrd==1.2.0xlrd库的open_workb
- python 2.6编写,自己瞎写的,备用''' Export and Import ElasticSe
- 前言最近,我已经成功将我的个人网站从 Flask 迁移到 Django 了,最早接触 Django 的时候大概是在 4 年前,我记得那个时候
- 这个操作现在看来真没啥难的,但是我找相关的资料真的找了好久。多数大佬都是直接pandas官网甩我脸上,然后举一个入门级的例子。https:/