详解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实现保存网页到本地示例
Mar 16 Python
提升Python程序运行效率的6个方法
Mar 31 Python
Python多进程同步简单实现代码
Apr 27 Python
Python 类与元类的深度挖掘 I【经验】
May 06 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 Python
python使用opencv驱动摄像头的方法
Aug 03 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
Nov 29 Python
python 将对象设置为可迭代的两种实现方法
Jan 21 Python
python实现连连看辅助(图像识别)
Mar 25 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
Aug 05 Python
Python 定义只读属性的实现方式
Mar 05 Python
Python第三方包之DingDingBot钉钉机器人
Apr 09 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中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
php检测iis环境是否支持htaccess的方法
2014/02/18 PHP
简述php环境搭建与配置
2016/12/05 PHP
文本加密解密
2006/06/23 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
2013/04/22 Javascript
javascript解析json实例详解
2014/11/05 Javascript
Node.js的包详细介绍
2015/01/14 Javascript
DOM基础教程之事件类型
2015/01/20 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
2015/11/21 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
JsonProperty 的使用方法详解
2019/10/11 Javascript
vue中英文切换实例代码
2020/01/21 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
[06:10]6.81新信使新套装!给你一个炫酷的DOTA2
2014/05/06 DOTA
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
python使用新浪微博api上传图片到微博示例
2014/01/10 Python
在Python中利用Into包整洁地进行数据迁移的教程
2015/03/30 Python
Python装饰器基础概念与用法详解
2018/12/22 Python
对python使用telnet实现弱密码登录的方法详解
2019/01/26 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
关于运动会广播稿300字
2014/10/05 职场文书
初中家长评语大全
2014/12/26 职场文书
电气工程师岗位职责
2015/02/12 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
农村老人去世追悼词
2015/06/23 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
悬疑名作《朋友游戏》动画无字ED宣传片 新角色公开
2022/04/13 日漫
面试官问我Mysql的存储引擎了解多少
2022/08/05 MySQL