在pandas多重索引multiIndex中选定指定索引的行方法
作者:PIPIXIU 发布时间:2023-07-07 22:04:16
在multiIndex中选定指定索引的行
我们在用pandas类似groupby来使用多重index时,有时想要对多个level中的某个index对应的行进行操作,就需要在dataframe中找到该index对应的行,在单层index中我们可以方便的使用df.loc[index]来选择,在多重Index中我们可以利用的类似的思路,然而其中也有一些小坑,记录如下。
1 index为有序的
1.1 创建测试数据
首先创建一个dataframe数据
df = pd.DataFrame({'class':['A','A','A','B','B','B','C','C'],
'id':['a','b','c','a','b','c','a','b'],
'value':[1,2,3,4,5,6,7,8]})
df中内容如下图:
1.2 设置multiIndex
通过set_index设为多重索引
df = df.set_index(['class','id'])
设置索引后效果:
1.3 切片筛选index
这里同样使用loc定位
df.loc[('A',slice(None)),:]
各参数的解释如下:
loc[(a,b),c]中第一个参数元组为索引内容,a为level0索引对应的内容,b为level1索引对应的内容
因为df是一个dataframe,所以要用c来指定列
这里‘A',指选择class中的A类
slice(None), 是Python中的切片操作,这里用来选择任意的id,要注意!不能使用‘:'来指定任意index
‘:',用来指定dataframe任意的列
执行后的结果如下:
同样,如果想只保留id中的'a',则可以使用:
df.loc[(slice(None),'a'),:]
2 index无序
前面的例子对应的index列为数字或字母,是有序的,接下来我们看看index列为中文的情况。
2.1 创建无序测试数据
df2 = pd.DataFrame({'课程':['语文','语文','数学','数学'],'得分':['最高','最低','最高','最低'],'分值':[90,50,100,60]})
df2 = df2.set_index(['课程','得分'])
2.2 尝试切片选择index
df2.loc[('语文',slice(None)),:]
我们进行同样的操作,这时会发现提示出错:
UnsortedIndexError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (2), lexsort depth (0)'
这是因为此时的index无法进行排序,在pandas文档中提到:Furthermore if you try to index something that is not fully lexsorted, this can raise:
我们可以通过 df2.index.is_lexsorted()来检查index是否有序,
In[1]: df2.index.is_lexsorted()
out[1]: False
接下来,我们尝试对Index进行排序。(排序时要在level里指定index名)
2.3 对index排序后切片选择index
df2 = df2.sort_index(level='课程')
df2.loc[('语文',slice(None)),:]
得到了我们想要的结果。
参考文献:pandas-docs-MultiIndex / Advanced Indexing
来源:https://blog.csdn.net/PIPIXIU/article/details/80232805


猜你喜欢
- 前言最近发现CentOS 7下升级MySQL5.7.23的一个坑,以前面升级到MySQL 5.7.23的一个集群为例在我们环境下打开文件描述
- 每个数据的访问都用自己的通信协议,包括还有不同的接口调用,参数传递。在同一个程序里要使用不同数据库里的信息,按照正常的情况来说,那就要写不同
- 1 lambdalambda原型为:lambda 参数:操作(参数)lambda函数也叫匿名函数,即没有具体名称的函数,它允许快速定义单行函
- 本文为大家分享了vue如何搭建多页面多系统应用,供大家参考,具体内容如下一、多页面多系统应用1、思路使用Vue搭建多页应用。所有系统都在同一
- 问题描述在深度学习相关任务的训练时,需要在训练的每个 epoch 记录当前 epoch 的准确率(如下图所示),那么在 python 中要怎
- Click 是用 Python 写的一个第三方模块,用于快速创建命令行。我们知道,Python 内置了一个 Argparse 的标准库用于创
- 前言在ECMAScript中,有两个最常用的创建函数对象的方法,即使用函数表达式或者使用函数声明。对此,ECMAScript规范明确了一点,
- 热加载是指可以在不重启服务的情况下,保存后即可让更改的代码生效的一种开发模式。热加载可以显著的提升开发和调试的效率,有了热加载后,说明你不用
- NVIDIA驱动安装与更新首先查看电脑的显卡版本,步骤为:此电脑右击–>管理–>设备管理
- 简介Wikipedia、Facebook 和 Yahoo! 等主要 web 属性使用 LAMP 架构来为每天数百万的请求提供服务,而 Wor
- 在做开发的朋友特别是和mysql有接触的朋友会碰到有时mysql查询很慢,当然我指的是大数据量百万千万级了,不是几十条了,下面我们来看看解决
- 这篇文章主要介绍了python 图像处理画一个正弦函数代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 1、 isalnum() :判断字符串所有的字符都是字母或者数字。返回true和falseIn [1]: str1='jiangwe
- 无水印视频下载方法一:无水印视频下载很简单,有一个通用的方法,就是使用去水印平台即可。我使用的去水印平台是:http://douyin.ii
- 视图视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集,并可以将其当作
- UUID (Universally Unique Identifier,通用唯一标识)是一个128位的用于计算机系统中以识别信息的数目,虽然
- 小书学习的主要方向是TensorFlow和Pytorch,今天就来安装一下Pytorch。第一步:去官网看看Pytorch官网:(https
- 题目描述目录hw1下的图像是一些胶片的照片,请将其进行度量矫正。推荐流程:采用Canny算子,检测边缘点;采用Hough直线检测,根据边缘点
- 简介:轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果。代码如下:import cv2 as
- 菜单栏,tools--去掉勾选的Vim Emulator这个仿真插件就好了。来源:https://blog.csdn.net/weixin_