在pandas多重索引multiIndex中选定指定索引的行方法


Posted in Python onNovember 16, 2018

在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中内容如下图:

在pandas多重索引multiIndex中选定指定索引的行方法

1.2 设置multiIndex

通过set_index设为多重索引

df = df.set_index(['class','id'])

设置索引后效果:

在pandas多重索引multiIndex中选定指定索引的行方法

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任意的列

执行后的结果如下:

在pandas多重索引multiIndex中选定指定索引的行方法

同样,如果想只保留id中的'a',则可以使用:

df.loc[(slice(None),'a'),:]

2 index无序

前面的例子对应的index列为数字或字母,是有序的,接下来我们看看index列为中文的情况。

2.1 创建无序测试数据

df2 = pd.DataFrame({'课程':['语文','语文','数学','数学'],'得分':['最高','最低','最高','最低'],'分值':[90,50,100,60]})
df2 = df2.set_index(['课程','得分'])

在pandas多重索引multiIndex中选定指定索引的行方法

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多重索引multiIndex中选定指定索引的行方法

得到了我们想要的结果。

参考文献:pandas-docs-MultiIndex / Advanced Indexing

以上这篇在pandas多重索引multiIndex中选定指定索引的行方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
下载安装setuptool和pip linux安装pip    
Jan 24 Python
详解Python的单元测试
Apr 28 Python
python 按不同维度求和,最值,均值的实例
Jun 28 Python
详解pandas数据合并与重塑(pd.concat篇)
Jul 09 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
用Python写一个自动木马程序
Sep 17 Python
Python如何实现强制数据类型转换
Nov 22 Python
python深copy和浅copy区别对比解析
Dec 26 Python
利用Python代码实现一键抠背景功能
Dec 29 Python
python3读取autocad图形文件.py实例
Jun 05 Python
用于ETL的Python数据转换工具详解
Jul 21 Python
解决Python3.8运行tornado项目报NotImplementedError错误
Sep 02 Python
对Pandas MultiIndex(多重索引)详解
Nov 16 #Python
一百行python代码将图片转成字符画
Feb 19 #Python
Pandas GroupBy对象 索引与迭代方法
Nov 16 #Python
python实现指定字符串补全空格、前面填充0的方法
Nov 16 #Python
pandas 透视表中文字段排序方法
Nov 16 #Python
用Python实现数据的透视表的方法
Nov 16 #Python
pandas pivot_table() 按日期分多列数据的方法
Nov 16 #Python
You might like
用Socket发送电子邮件
2006/10/09 PHP
Destoon模板制作简明教程
2014/06/20 PHP
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
JavaScript的jQuery库中function的存在和参数问题
2015/08/13 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
通过BootStrap实现轮播图的实际应用
2016/09/26 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
js 作用域和变量详解
2017/02/16 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
2020/03/03 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
python爬取网站数据保存使用的方法
2013/11/20 Python
python实现用户登录系统
2016/05/21 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
对python创建及引用动态变量名的示例讲解
2018/11/10 Python
python 内置模块详解
2019/01/01 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
pytorch 预训练层的使用方法
2019/08/20 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
2021/02/03 Python
波兰补充商店:Muscle Power
2018/10/29 全球购物
高中生毕业学习总结的自我评价
2013/11/14 职场文书
辅导员评语
2014/05/04 职场文书
民主生活会剖析材料
2014/09/30 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
劳资员岗位职责
2015/02/13 职场文书
离婚代理词范文
2015/05/23 职场文书
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android