详解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 相关文章推荐
非递归的输出1-N的全排列实例(推荐)
Apr 11 Python
Python部署web开发程序的几种方法
May 05 Python
python使用正则表达式的search()函数实现指定位置搜索功能
Nov 10 Python
Python进阶学习之特殊方法实例详析
Dec 01 Python
Python跨文件全局变量的实现方法示例
Dec 10 Python
TensorFlow变量管理详解
Mar 10 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
Oct 09 Python
python_opencv用线段画封闭矩形的实例
Dec 05 Python
详解Python的循环结构知识点
May 20 Python
python安装requests库的实例代码
Jun 25 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 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数组对比函数,存在交集则返回真,否则返回假
2011/02/03 PHP
php 伪造本地文件包含漏洞的代码
2011/11/03 PHP
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
js+css实现select的美化效果
2016/03/24 Javascript
详解基于Bootstrap+angular的一个豆瓣电影app
2017/06/26 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
2018/08/08 jQuery
JS实现利用闭包判断Dom元素和滚动条的方向示例
2019/08/26 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
JS如何在数组指定位置插入元素
2020/03/10 Javascript
JS一次前端面试经历记录
2020/03/19 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
对python中的try、except、finally 执行顺序详解
2019/02/18 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
SEPHORA丝芙兰捷克官网:购买香水、化妆品和护肤品
2018/11/26 全球购物
判断单链表中是否存在环
2012/07/16 面试题
为什么要使用servlet
2016/01/17 面试题
2014新年寄语
2014/01/20 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
情人节寄语大全
2014/04/11 职场文书
校园元旦活动总结
2014/07/09 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
承诺书范本
2015/01/21 职场文书
长江三峡导游词
2015/01/31 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
《火烧云》教学反思
2016/02/23 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS