在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 相关文章推荐
详解Python的Flask框架中的signals信号机制
Jun 13 Python
Python中字典的setdefault()方法教程
Feb 07 Python
Python使用getpass库读取密码的示例
Oct 10 Python
Python中Threading用法详解
Dec 27 Python
浅谈Python对内存的使用(深浅拷贝)
Jan 17 Python
python处理csv数据动态显示曲线实例代码
Jan 23 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
Dec 02 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
在Pycharm中修改文件默认打开方式的方法
Jan 17 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
Python threading模块condition原理及运行流程详解
Oct 05 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
[原创]PHP中通过ADODB库实现调用Access数据库之修正版本
2006/12/31 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
基于jquery的$.ajax async使用
2011/10/19 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
JS实现合并两个数组并去除重复项只留一个的方法
2015/12/17 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
使用Vue.js和Element-UI做一个简单登录页面的实例
2018/02/23 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
2020/02/23 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
用python生成1000个txt文件的方法
2018/10/25 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
详解numpy矩阵的创建与数据类型
2019/10/18 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
浅谈Python 参数与变量
2020/06/20 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
NET程序员上机面试题
2015/05/23 面试题
应聘美工求职信
2013/11/07 职场文书
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
医药营销个人求职信范文
2014/02/07 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
七年级上册生物的课件
2019/08/07 职场文书
Pytest中skip skipif跳过用例详解
2021/06/30 Python
解决MySQL报“too many connections“错误
2022/04/19 MySQL