【数据处理包Pandas】多级索引的创建及使用

目录

    • 一、元组作为一级索引
      • (一)示例1
      • (二)示例2
    • 二、引入多级索引
      • (一)多级索引的创建
      • (二)多级索引中的数学选取


首先,导入 NumPy 库和 Pandas 库。

import numpy as np
import pandas as pd

一、元组作为一级索引

如果想产生如下图所示的学生成绩表:

在这里插入图片描述
因为 DataFrame 的行索引/列索引要求是不可变的,因此考虑使用元组做索引是很自然的选择。

s_index = [(2016,1),(2016,2),(2017,1),(2017,2)]
s_columns = [('王亮','语文'),('王亮','数学'),('王亮','英语'),('李海','语文'),('李海','数学'),('李海','英语'),('富强','语文'),('富强','数学'),('富强','英语')]
scores = pd.DataFrame(np.random.randint(60,100,(4,9)),index=s_index,columns=s_columns)
scores

在这里插入图片描述

上述由元组构成的行索引/列索引的缺点是使用不够方便,举例说明如下:

(一)示例1

使用元组索引查询时,对 Series 和 DataFrame 的操作不统一,后者需要对元组索引额外加中括号,而前者不用!

1、查询王亮的数学成绩

# 查询王亮的数学成绩
scores[('王亮','数学')]

在这里插入图片描述

2、查询2017年第一学期的成绩

# 查询2017年第一学期的成绩
scores.loc[(2017,1)]---出错!相当于scores.loc[2017,1],此时会把2017看成行索引,1看成列索引,而行索引没有2017

对于 DataFrame,应该在元组的外面再加一层中括号,写成:

scores.loc[[(2017,1)]]

在这里插入图片描述

当然用位置标签是最简单的:

scores.iloc[2,:]

在这里插入图片描述

3、查询王亮2017第1学期的成绩

如果用 DataFrame 直接做查询,则表示行索引和列索引的元组外都要多加一层中括号,需要写成:

scores.loc[[(2017,1)],[('王亮','数学')]]

在这里插入图片描述

但是对于 Series,则无需在元组外面加一层中括号,例如,先得到 Series 再用元组索引可写成:

scores[('王亮','数学')][(2017,1)]

直接使用位置标签:

scores.iloc[2,1]
69

(二)示例2

查询语文成绩时,需要写循环,无法使用切片中的冒号(:)语法,不太方便。

for col in scores.columns:if col[1]=='语文':print(scores[col])

在这里插入图片描述

上述例子说明:把元组用作单级索引来表示多个维度的信息,不是一个很好的选择!

二、引入多级索引

(一)多级索引的创建

MultiIndex 对象是 Pandas 标准 Index 的子类,由它来表示多层索引业务。 可以将 MultiIndex 视为一个元组对数组,其中每个元组对都是唯一的。

创建主要有三个相关的函数:from_tuples、from_arrays和from_product,它们都是pd.MultiIndex类的方法

1、使用pd.MultiIndex.from_tuples创建 MultiIndex 对象和 DataFrame 对象

t1 = pd.MultiIndex.from_tuples(s_index)
t1
MultiIndex(levels=[[2016, 2017], [1, 2]],labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
t2 = pd.MultiIndex.from_tuples(s_columns)
t2
MultiIndex(levels=[['富强', '李海', '王亮'], ['数学', '英语', '语文']],labels=[[2, 2, 2, 1, 1, 1, 0, 0, 0], [2, 0, 1, 2, 0, 1, 2, 0, 1]])
scores = pd.DataFrame(np.random.randint(60,100,(4,9)),index=t1,columns=t2)
scores

在这里插入图片描述

2、使用pd.MultiIndex.from_arrays创建 MultiIndex 对象和 DataFrame 对象

a1 = pd.MultiIndex.from_arrays([[2016,2016,2017,2017],[1,2,1,2]])   # 两级索引都放在列表中,属于花式索引的写法
a1
MultiIndex(levels=[[2016, 2017], [1, 2]],labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
a2 = pd.MultiIndex.from_arrays([['王亮','王亮','王亮','李海','李海','李海','富强','富强','富强'],['语文','数学','英语','语文','数学','英语','语文','数学','英语']])   
a2
MultiIndex(levels=[['富强', '李海', '王亮'], ['数学', '英语', '语文']],labels=[[2, 2, 2, 1, 1, 1, 0, 0, 0], [2, 0, 1, 2, 0, 1, 2, 0, 1]])
scores = pd.DataFrame(np.random.randint(60,100,(4,9)),index=a1,columns=a2)
scores

在这里插入图片描述

3、使用pd.MultiIndex.from_product创建 MultiIndex 对象和 DataFrame 对象(推荐!)

r_index = pd.MultiIndex.from_product([[2016,2017],[1,2]],names=['年份','学期'])
r_index
MultiIndex(levels=[[2016, 2017], [1, 2]],labels=[[0, 0, 1, 1], [0, 1, 0, 1]],names=['年份', '学期'])
c_index = pd.MultiIndex.from_product([['王亮','李海','富强'],['语文','数学','英语']],names=['姓名','课程'])
c_index   # 下面显示的levels的内容是系统已经拍过序的
MultiIndex(levels=[['富强', '李海', '王亮'], ['数学', '英语', '语文']],labels=[[2, 2, 2, 1, 1, 1, 0, 0, 0], [2, 0, 1, 2, 0, 1, 2, 0, 1]],names=['姓名', '课程'])
np.random.seed(666)
scores = pd.DataFrame(np.random.randint(60,100,(4,9)),index=r_index,columns=c_index)
scores

在这里插入图片描述

(二)多级索引中的数学选取

1、基于列索引选取数据

# 基于列的第1层索引选取单列
scores['富强']

在这里插入图片描述

# 基于列的第1层索引选取多列,需要使用花式索引
scores[['富强','王亮']]

在这里插入图片描述
补充说明:

排序时默认按第一个字符的 Unicode 编码顺序升序排序。
查看一个字符的十进制 Unicode 编码:ord(字符);查看一个字符的十六进制 Unicode 编码:hex(ord(字符))。

  • level 0级的排序:富、李、王的十进制Unicode编码分别是23500、26446和29579
  • level 1级的排序:数、英和语十进制Unicode编码分别是25968、33521和35821

sort_index()没有指明对哪个级别的列索引排序,默认对两级列索引都做了排序。如果只对level 0级的列索引排序,则应指明参数level=0;要对level 0级升序,而level 1级降序,则应该额外使用参数level=[0,1],ascending=[True,False]

scores.sort_index(axis=1,inplace=True)   # axis=1指明对列索引按升序排列,注意inplace=True后才能看到排序结果  
scores

在这里插入图片描述

# axis=0指明对行索引排序
scores.sort_index(axis=0,inplace=True,level=[0,1],ascending=[False,True])
scores

在这里插入图片描述

# 基于列的第2层索引选取单独1列
scores.loc[:,(slice(None),'语文')]

其中的:表示行索引是任意的,切片slice(None)表示第 0 级列索引是任意的。
注意:元组中不允许使用:,因此用slice(None)代替。
说明:多级索引的切片操作要求必须先对索引排序,因此才有上面的sort_index()函数调用。

在这里插入图片描述

# 基于列的第2层索引选取多列
scores.loc[:,(slice(None),['语文','数学'])] 

其中的花式索引['语文','数学']表示选取 level 1 级列索引是语文和数学的两列。

在这里插入图片描述

# 同时基于列的第1层和第2层索引选取数据
scores['李海','语文']   # 等价于scores[('李海','语文')]

注意:虽然scores[('李海','语文')]可以,但不能使用scores[(slice(None),'语文')]选取所有的语文成绩。而只能通过scores.loc[:,(slice(None),'语文')]选取所有的语文成绩。

在这里插入图片描述

小结:无论基于行索引还是列索引选取数据,只要没指定最高级索引,则必须使用.loc[行索引,列索引]的形式。

2、基于行索引选取数据

基于行索引选取数据,必须使用.loc[]的形式。

# 基于行的单个第1层索引值选取数据
scores.loc[2017]

在这里插入图片描述

# 基于行的多个第1层索引值选取数据
scores.loc[[2017,2016]]

在这里插入图片描述

# 基于行的单个第2层索引值选取数据
scores.loc[(slice(None),2),:]    # 不能写成scores.loc[(slice(None),2)]或scores.loc[slice(None),2]的形式

在这里插入图片描述

# 基于行的多个第2层索引值选取数据
scores.loc[(slice(None),[1,2]),:]   # 不能写成scores.loc[(slice(None),1:2),:],元组中不支持:进行切片操作

在这里插入图片描述

# 同时基于行的第1层和第2层索引选取数据
scores.loc[2016,2]   # 等价于scores.loc[(2016,2)]或scores.loc[(2016,2),:],表示元组的括号此时可以去掉
姓名  课程
富强  数学    72英语    75语文    78
李海  数学    99英语    65语文    76
王亮  数学    74英语    93语文    88
Name: (2016, 2), dtype: int32
# 查看2016年所有学生的数学和英语成绩
scores.loc[2016,(slice(None),['数学','英语'])]  #*1*
# 查看第2学期的全部数据
scores.loc[(slice(None),2),:]  #*2*    不能写成scores.loc[(slice(None),2)]或scores.loc[slice(None),2]的形式
# 查看李海同学的语文成绩
scores['李海','语文']  #*3* 等价于scores.loc[:,('李海','语文')] 或scores[('李海','语文')] 
# 查看2017年第1学期的成绩
scores.loc[2017,1]   #*4* 等价于scores.loc[(2017,1),:]或scores.loc[(2017,1)]

以#1——#4的语句为例来小结多级索引下的数据选取方式:

1、选取数据的通用形式:

(1)通用写法是:df.loc[(行索引),(列索引)],例如#1处;
(2)其中行/列索引分别构成元组,并且从左到右,索引级别依次下降,相邻级别间用逗号分隔;
(3)未指明的高级别行/列索引需要用slice(None)表示取任意值(例如#1处的第1级列索引);未指明的低级别索引可以不写(例如#1处的第2级行索引);如果同级别的索引有多个(例如#1处的第2级列索引),需要用花式索引而不能使用切片(元组不支持冒号:);

2、选取数据的简化形式:

(1)当只涉及列索引元组并且其中不包含slice(None)时,行索引元组可以用冒号(:)简化,写成df.loc[:,(列索引)];或者进一步简化成df[列索引](即loc行选择器和表示元组的圆括号都可以省略,例如#3处)
(2)当只涉及行索引元组并且其中不包含slice(None)时,列索引元组可以用冒号(:)简化,写成df.loc[(行索引),:];或者进一步简化成df.loc[行索引](即表示元组的圆括号也省略了,例如#4处);注意:loc行选择器不能省略,因为只要包含行索引,一定要使用行选择器loc或iloc,而选择列索引则不需要!
(3)无论行/列索引,只要有一个元组中包含slice(None),就不能使用上述简化形式,而必须使用通用形式(#1和#2处)

注意:为了在多级索引的中括号[]中可以使用切片(即使用冒号:),需要先使用sort_index()函数对索引进行排序。

上面的结论可以把前面的所有例子都归纳在其中!

# 多级索引中的行/列索引使用元组表示法,不方便之处在于对于元组内部的索引无法使用切片,为此引入IndexSlice对象
idx = pd.IndexSlice
# 用idx改写上面的*1*和#*2*语句
# 查看2016年所有学生的数学和英语成绩
scores.loc[2016,idx[:,['数学','英语']]]  #*1*  用:替代了slice(None)
scores.loc[2016,idx[:,'数学':'英语']]  # 与上面等价,用第2级列索引上的切片('数学':'英语')替代了上面的花式索引

在这里插入图片描述

# 查看第2学期的全部数据
scores.loc[idx[:,2],:]   #*2*

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/788187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

monitor link 联合smart link配合应对复杂的网络

monitor link关键词:上行和下行端口,当上行端口异常,下行端口立即down掉,也就是一种联动机制 如果上行端口里面是smart link方式,则当主从端口都出问题时候,下行端口才会down掉 monitor link 配置步骤 1创…

Vue基础配置、组件通信、自定义指令

基础配置 Vue框架已经集成了webpack配置 小注意点 vbase 快速生成vue模板 组件名必须是多词格式(驼峰模式) 具体三种写法: ①小驼峰:abcDef.vue ②大驼峰:AbcDef.vue ③中横线:abc-def.vue 假如文件名不符合多次格式的补救办法: 导出重命名…

EFPN代码解读

论文 Extended Feature Pyramid Network for Small Object Detection python3 D:/Project/EFPN-detectron2-master/tools/train_net.py --config-file configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_1x_coco.yaml --num-gpus 1 训练脚本 cfg 中的配置 先获取配置…

基于51单片机的智能门禁系统仿真设计

**单片机设计介绍,基于51单片机的智能门禁系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的智能门禁系统仿真设计概要 一、设计概述 本设计旨在利用51单片机为核心控制器,结合…

Python程序设计 多重循环(二)

1.打印数字图形 输入n&#xff08;n<9)&#xff0c;输出由数字组成的直角三角图形。例如&#xff0c;输入5&#xff0c;输出图形如下 nint(input("")) #开始 for i in range(1,n1):for j in range(1,i1):print(j,end"")print()#结束 2.打印字符图形 …

pytest教程-22-用例依赖插件-pytest-dependency

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了pytest失败重跑插件pytest-rerunfailures&#xff0c;本小节我们讲解一下pytest用例依赖插件-pytest-dependency。 用例依赖 编写用例的时候&#xff0c;我们会注意用例之间的独立性&#xf…

【电源专题】电池不均衡的影响与原因

在使用多节电池设计产品时,大家都知道如果多节电池不均衡会影响电池寿命与充电安全。特别是在充电末端与放电末端时表现较为明显。 电池不均衡的影响 那么为什么会影响安全与寿命呢?其原因如下: 如果电池不均衡时,相当于木桶的短板效应。一方面没法充满,充电时电压高的那一…

《QT实用小工具·七》CPU内存显示控件

1、概述 源码放在文章末尾 CPU内存显示控件 项目包含的功能如下&#xff1a; 实时显示当前CPU占用率。实时显示内存使用情况。包括共多少内存、已使用多少内存。全平台通用&#xff0c;包括windows、linux、ARM。发出信号通知占用率和内存使用情况等&#xff0c;以便自行显示…

类和对象的下篇

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

2024年03月CCF-GESP编程能力等级认证Scratch图形化编程二级真题解析

本文收录于专栏《Scratch等级认证CCF-GESP真题解析》,专栏总目录・点这里. 一、单选题(共 10 题,每题 3 分,共 30 分) 第1题 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?( )。 A、小程序 B、计时器 C、操作系统 D、神话人物 答案:…

【漏洞复现】大华 DSS user_edit.action 信息泄露漏洞

0x01 产品简介 DSS是大华的大型监控管理应用平台&#xff0c;支持几乎所有涉及监控等方面的操作&#xff0c;支持多级跨平台联网等操作。 可将视频监控、卡口拍照、 区间测速 、电子地图、违章查询系统等诸多主流应用整合在一起&#xff0c;实现更加智能、便捷的分级查询服务。…

CPU设计实战-FPGA基础操作学习

目录 硬件调试方法 ILA&#xff08;监控内如何端口信号&#xff09;或VIO核&#xff08;不仅可以监控还可以驱动&#xff09;进行硬件调试 添加ILAIP核 实例化ILAIP核 使用ILA排查错误 另一个debug方法 仿真 代码固化&#xff08;即写入Flash中&#xff09; 方法一 方…

代码随想录算法训练营第四十二天 | 卡码网46. 携带研究材料、416. 分割等和子集

代码随想录算法训练营第四十二天 | 卡码网46. 携带研究材料、416. 分割等和子集 卡码网46. 携带研究材料题目解法 416. 分割等和子集题目解法 感悟 卡码网46. 携带研究材料 题目 解法 题解链接 二维数组 # include <bits/stdc.h> using namespace std;int n, bagweig…

Jackson 2.x 系列【6】注解大全篇二

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 注解大全2.11 JsonValue2.12 JsonKey2.13 JsonAnySetter2.14 JsonAnyGetter2.15 …

WebKit揭秘:从内部结构到应用程序开发

文章目录 WebKit结构简介核心模块其他组件多进程架构&#xff08;WebKit2&#xff09; Wekbit做了什么&#xff1f;应用程序如何利用 Webkit WebKit结构简介 WebKit是一个开源的浏览器引擎&#xff0c;它由多个模块组成&#xff0c;这些模块协同工作以提供Web内容的渲染和交互…

英伟达智算先锋训练,冲刺智算时代实战

随着数字经济的深入发展&#xff0c;智能算力作为关键生产力&#xff0c;其规模在2022年已达到268.0 EFLOPS&#xff0c;并预计到2028年将增长至2769 EFLOPS&#xff0c;显示出强劲的发展势头。在2024年政府工作报告中&#xff0c;也首次提出了“人工智能”行动&#xff0c;强调…

Python轻量级框架Flask开发web应用(附源码自取)

目录 介绍 安装 简单初使用 新建项目目录 视图映射 无参映射 带参映射 ? 传参映射 连接mysql orm对象视图映射建表 ​编辑 crud操作 新增操作 查询操作 普通查询 查询返回json数据 前端传递json体数据查询 更新操作 删除操作 orm表关系映射 flask-migrate迁…

【Vue】vue3简介与环境配置

文章目录 项目编码规范什么是 Vue&#xff1f;安装node环境nvm针对node版本惊醒管理的工具 项目编码规范 组合式API Typescript setup(语法糖) 什么是 Vue&#xff1f; Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;…

JavaBean是什么?

Bean的本意为豌豆、子实&#xff0c;在这里引申为一种实体。JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean&#xff0c;类必须是具体的和公共的&#xff0c;并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性&#xff0…

【总结】在嵌入式设备上可以离线运行的LLM--Llama

文章目录 Llama 简介运用另一种&#xff1a;MLC-LLM 一个令人沮丧的结论在资源受限的嵌入式设备上无法运行LLM&#xff08;大语言模型&#xff09;。 一丝曙光&#xff1a;tinyLlama-1.1b&#xff08;10亿参数&#xff0c;需要至少2.98GB的RAM&#xff09; Llama 简介 LLaMA…