详解pandas中MultiIndex和对象实际索引不一致问题


Posted in Python onJuly 23, 2019

在最新版的pandas中(不知道之前的版本有没有这个问题),当我们对具有多层次索引的对象做切片或者通过df[bool_list]的方式索引的时候,得到的新的对象尽管实际索引已经发生了改变,但是当直接使用df_new.index调取新对象的MultiIndex对象的时候,这个MultiIndex对象还是和原对象的索引保持一致的,而不是和新对象的实际索引保持一致。这点需要特别注意,因为正常情况下,我们自然会认为df.index的MultiIndex对象和df的实际索引是一致的,基于此,我们可能会写出一些难以发现的bug。可以看下面的例子。

import pandas as pd
 
df_t1=pd.DataFrame([[1,2],[2,3],[2,3],[3,5]],index=[['a','a','b','b'],[0,1,0,1]])
 
df_t1
Out[39]: 
   0 1
a 0 1 2
 1 2 3
b 0 2 3
 1 3 5
 
df_t2=df_t1.loc[[x=='a' for x in df_t1.index.levels[0]]]
 
df_t2 
Out[41]: 
   0 1
a 0 1 2
 
df_t2.index  #从上面df_t2对象的输出结果和下面index的输出结果可以发现,df_t2的index和其实际的索引并不一致
Out[42]: 
MultiIndex(levels=[['a', 'b'], [0, 1]],
      codes=[[0], [0]])
 
df_t3=df_t1.iloc[:2,:]
 
df_t3
Out[46]: 
   0 1
a 0 1 2
 1 2 3
 
df_t3.index #从上面df_t3对象的输出结果和下面index的输出结果可以发现,df_t3的index和其实际的索引也不一致
Out[47]: 
MultiIndex(levels=[['a', 'b'], [0, 1]],
      codes=[[0, 0], [0, 1]])

从上面的例子可以看出,当通过bool索引和切片索引时,就会出现这种问题,其他的索引方式一般不会出现这种问题。当遇到这种问题时,如果我们需要始终保持新对象的index得到的对象和实际索引一致,该如何做呢?请看下面代码

df_t2.index.remove_unused_levels()
Out[62]: 
MultiIndex(levels=[['a'], [0]],
      codes=[[0], [0]])
 
df_t2.index=df_t2.index.remove_unused_levels()
 
df_t2.index
Out[75]: 
MultiIndex(levels=[['a'], [0]],
      codes=[[0], [0]])
 
df_t2
Out[76]: 
   0 1
a 0 1 2

可以看到,MultiIndex对象有一个remove_unused_levels()函数,其作用是把没有被使用的索引被去处掉,这样就可以使得对象的MultiIndex对象和其实际显示出来的索引保持一致了。故其实在遇到多层次索引的切片索引或者bool索引之后,加上一条df.index.remove_unused_levels()语句不失为一个好的习惯,或者至少得有这种意识,意识到此处可能会出现这种问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中replace方法实例分析
Aug 20 Python
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
Jun 03 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
详解Python sys.argv使用方法
May 10 Python
python实现批量修改服务器密码的方法
Aug 13 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
Python学习之路安装pycharm的教程详解
Jun 17 Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 Python
Python爬虫之Selenium下拉框处理的实现
Dec 04 Python
python for循环赋值问题
Jun 03 Python
python视频按帧截取图片工具
Jul 23 #Python
python如何实现从视频中提取每秒图片
Oct 22 #Python
详解Django 时间与时区设置问题
Jul 23 #Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 #Python
python 抓包保存为pcap文件并解析的实例
Jul 23 #Python
Django ModelForm组件使用方法详解
Jul 23 #Python
Pandas之groupby( )用法笔记小结
Jul 23 #Python
You might like
php制作unicode解码工具(unicode编码转换器)代码分享
2013/12/24 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
php版银联支付接口开发简明教程
2016/10/14 PHP
PHP如何使用array_unshift()在数组开头插入元素
2020/09/01 PHP
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
js实现拖拽效果
2015/02/12 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
简述Matlab中size()函数的用法
2016/03/20 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
Python实现从url中提取域名的几种方法
2014/09/26 Python
Python的Django框架下管理站点的基本方法
2015/07/17 Python
python简单分割文件的方法
2015/07/30 Python
Python实现的概率分布运算操作示例
2017/08/14 Python
基于python绘制科赫雪花
2018/06/22 Python
flask实现验证码并验证功能
2019/12/05 Python
python实现PCA降维的示例详解
2020/02/24 Python
马来西亚网上购物:Youbeli
2018/03/30 全球购物
蔻驰法国官网:COACH法国
2018/11/14 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
学生自我鉴定
2013/12/18 职场文书
生日派对邀请函
2014/01/13 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
公司酒会致辞
2015/07/30 职场文书
学会感恩主题班会
2015/08/12 职场文书
贷款担保书范本
2015/09/22 职场文书
Python爬虫:从m3u8文件里提取小视频的正确操作
2021/05/14 Python