详解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多进程编程技术实例分析
Sep 16 Python
Python的Bottle框架的一些使用技巧介绍
Apr 08 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
连接Python程序与MySQL的教程
Apr 29 Python
简单谈谈Python中的几种常见的数据类型
Feb 10 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
Mar 01 Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 Python
python框架flask表单实现详解
Nov 04 Python
Python调用.NET库的方法步骤
Dec 27 Python
python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法
Feb 14 Python
python 实现rolling和apply函数的向下取值操作
Jun 08 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利用COM对象访问SQLServer、Access
2006/10/09 PHP
留言板翻页的实现详解
2006/10/09 PHP
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
PHP删除非空目录的函数代码小结
2013/02/28 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
PHP 常用的header头部定义汇总
2015/06/19 PHP
PHP生成随机密码方法汇总
2015/08/27 PHP
使用PHP+MySql实现微信投票功能实例代码
2017/09/29 PHP
JavaScript 事件参考手册
2008/12/24 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
javascript中的return和闭包函数浅析
2014/06/06 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
浅谈NodeJS中require路径问题
2015/05/07 NodeJs
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
JSON字符串和对象相互转换实例分析
2016/06/16 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
基于JavaScript实现一个简单的Vue
2018/09/26 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
JavaScript实现简单进度条效果
2020/03/25 Javascript
解决Python requests 报错方法集锦
2017/03/19 Python
python求最大连续子数组的和
2018/07/07 Python
Django怎么在admin后台注册数据库表
2020/11/14 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
学校运动会报道稿
2014/09/23 职场文书
班主任自我评价范文
2015/03/11 职场文书
今日说法观后感
2015/06/08 职场文书
追讨欠款律师函
2015/06/24 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
mysql脏页是什么
2021/07/26 MySQL
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android