详解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 文件和路径操作函数小结
Nov 23 Python
Python检测字符串中是否包含某字符集合中的字符
May 21 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
wxPython的安装图文教程(Windows)
Dec 28 Python
对Python 3.5拼接列表的新语法详解
Nov 08 Python
Python一句代码实现找出所有水仙花数的方法
Nov 13 Python
python实现高斯(Gauss)迭代法的例子
Nov 20 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
Python生成并下载文件后端代码实例
Aug 31 Python
python 如何区分return和yield
Sep 22 Python
Python 无限级分类树状结构生成算法的实现
Jan 21 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动态生成函数示例
2014/03/21 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
又一个小巧的图片预加载类
2007/05/05 Javascript
不用写JS也能使用EXTJS视频演示
2008/12/29 Javascript
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
Javascript解决常见浏览器兼容问题的12种方法
2010/01/04 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
Vue 创建组件的两种方法小结(必看)
2018/02/23 Javascript
使用vue-cli编写vue插件的方法
2018/02/26 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
python基础教程之popen函数操作其它程序的输入和输出示例
2014/02/10 Python
python发送邮件示例(支持中文邮件标题)
2014/02/16 Python
PyQt5实现暗黑风格的计时器
2019/07/29 Python
详解Python self 参数
2019/08/30 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
Django 自定义分页器的实现代码
2019/11/24 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
html5之Canvas路径绘图、坐标变换应用实例
2012/12/26 HTML / CSS
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
几个常见的消息中间件(MOM)
2014/01/08 面试题
介绍下Java中==和equals的区别
2013/09/01 面试题
奶茶店创业计划书范文
2014/01/17 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
导游词之无锡梅园
2019/11/28 职场文书
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle