详解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 相关文章推荐
win10环境下python3.5安装步骤图文教程
Feb 03 Python
python使用super()出现错误解决办法
Aug 14 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
python使用tkinter库实现五子棋游戏
Jun 18 Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 Python
Python 函数list&read&seek详解
Aug 28 Python
python 字符串常用函数详解
Sep 11 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
Apr 13 Python
matplotlib基础绘图命令之imshow的使用
Aug 13 Python
python Scrapy框架原理解析
Jan 04 Python
python 判断字符串当中是否包含字符(str.contain)
Jun 01 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
德生PL990的分析评价
2021/03/02 无线电
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
prototype1.4中文手册
2006/09/22 Javascript
Js动态创建div
2008/09/25 Javascript
JavaScript 在各个浏览器中执行的耐性
2009/04/06 Javascript
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
JS+JSP checkBox 全选具体实现
2014/01/02 Javascript
浅谈javascript构造函数与实例化对象
2015/06/22 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
JavaScript必知必会(六) delete in instanceof
2016/06/08 Javascript
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
微信小程序网络层封装的实现(promise, 登录锁)
2019/05/08 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
vc6编写python扩展的方法分享
2014/01/17 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
python生成器用法实例详解
2019/11/22 Python
python中with语句结合上下文管理器操作详解
2019/12/19 Python
零基础学Python之前需要学c语言吗
2020/07/21 Python
使用python实现学生信息管理系统
2021/02/25 Python
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
会务接待方案
2014/02/27 职场文书
法人代表委托书
2014/04/04 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
2016年秋季新学期致辞
2015/07/30 职场文书
python爬虫selenium模块详解
2021/03/30 Python
Mysql将字符串按照指定字符分割的正确方法
2022/05/30 MySQL