详解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 返回汉字的汉语拼音
Feb 27 Python
python定时检查启动某个exe程序适合检测exe是否挂了
Jan 21 Python
Python httplib模块使用实例
Apr 11 Python
Python中二维列表如何获取子区域元素的组成
Jan 19 Python
利用matplotlib+numpy绘制多种绘图的方法实例
May 03 Python
Python 操作文件的基本方法总结
Aug 10 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
Python 统计字数的思路详解
May 08 Python
pandas 对每一列数据进行标准化的方法
Jun 09 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
pygame编写音乐播放器的实现代码示例
Nov 19 Python
Python常遇到的错误和异常
Nov 02 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
第十一节--重载
2006/11/16 PHP
?算你??的 PHP 程式大小
2006/12/06 PHP
php实现的百度搜索某地天气的小偷代码
2014/04/23 PHP
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
phpmailer绑定邮箱的实现方法
2016/12/01 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
发现的以前不知道的函数
2006/09/19 Javascript
utf8的编码算法 转载
2006/12/27 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
js动态切换图片的方法
2015/01/20 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
vue.js实现的经典计算器/科学计算器功能示例
2018/07/11 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
2019/03/07 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
Python 不同对象比较大小示例探讨
2014/08/21 Python
Python内建数据结构详解
2016/02/03 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
python Pexpect 实现输密码 scp 拷贝的方法
2019/01/03 Python
Python表达式的优先级详解
2020/02/18 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
企业宣传方案
2014/03/04 职场文书
简单的项目建议书模板
2014/03/12 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
升学宴来宾致辞
2015/07/27 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
Python实现Telnet自动连接检测密码的示例
2021/04/16 Python
教你快速开启Apache SkyWalking的自监控
2021/04/25 Servers
Python自动化之批量处理工作簿和工作表
2021/06/03 Python
Java实现多线程聊天室
2021/06/26 Java/Android