详解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的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 Python
Python数据类型详解(三)元祖:tuple
May 08 Python
python自带的http模块详解
Nov 06 Python
pyqt5自定义信号实例解析
Jan 31 Python
python爬虫爬取微博评论案例详解
Mar 27 Python
python常用函数与用法示例
Jul 02 Python
Python学习笔记之迭代器和生成器用法实例详解
Aug 08 Python
Python 实现自动获取种子磁力链接方式
Jan 16 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
Python使用tkinter制作在线翻译软件
Feb 22 Python
python tkinter实现定时关机
Apr 21 Python
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
Nov 11 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 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
PHP防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
JS中Location使用详解
2015/05/12 Javascript
js实现显示当前状态的导航效果代码
2015/08/28 Javascript
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
2016/08/01 Javascript
详解Javascript中prototype属性(推荐)
2016/09/03 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
2017/07/13 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
原生JS写Ajax的请求函数功能
2017/12/22 Javascript
Vue组件的使用教程详解
2018/01/05 Javascript
[43:18]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
Python中itertools模块用法详解
2014/09/25 Python
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
Python 中的 else详解
2016/04/23 Python
python实现用户登录系统
2016/05/21 Python
完美解决Python2操作中文名文件乱码的问题
2017/01/04 Python
python xpath获取页面注释的方法
2019/01/14 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
Python给图像添加噪声具体操作
2019/03/03 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
py-charm延长试用期限实例
2019/12/22 Python
Python pytesseract验证码识别库用法解析
2020/06/29 Python
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
英文简历中的自我评价
2013/10/06 职场文书
三年级评语大全
2014/04/23 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
Python循环之while无限迭代
2022/04/30 Python