详解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使用pil生成缩略图的方法
Mar 26 Python
使用django-crontab实现定时任务的示例
Feb 26 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
Sep 02 Python
python单线程下实现多个socket并发过程详解
Jul 27 Python
python3中的eval和exec的区别与联系
Oct 10 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
Python集成开发工具Pycharm的安装和使用详解
Mar 18 Python
使用Django清空数据库并重新生成
Apr 03 Python
python能做哪些生活有趣的事情
Sep 09 Python
python控制台打印log输出重复的解决方法
May 14 Python
Pygame Rect区域位置的使用(图文)
Nov 17 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文件读写操作之文件读取方法详解
2011/01/13 PHP
模板引擎正则表达式调试小技巧
2011/07/20 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
一个js封装的不错的选项卡效果代码
2008/02/15 Javascript
javascript最常用与实用的创建类的代码
2010/08/12 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
jquery获取选中的文本和值的方法
2014/07/08 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
vue axios同步请求解决方案
2017/09/29 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
微信小程序(订阅消息)功能
2019/10/25 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
javascript实现前端input密码输入强度验证
2020/06/24 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
详解Python中的循环语句的用法
2015/04/09 Python
python SQLAlchemy 中的Engine详解
2019/07/04 Python
python类的实例化问题解决
2019/08/31 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
2020/02/26 Python
解决django接口无法通过ip进行访问的问题
2020/03/27 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
python 利用jieba.analyse进行 关键词提取
2020/12/17 Python
css3边框_动力节点Java学院整理
2017/07/11 HTML / CSS
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
abstract class和interface有什么区别?
2012/01/03 面试题
副处级干部考察材料
2014/05/17 职场文书
房产分割协议书范文
2014/11/21 职场文书
2014年企业党支部工作总结
2014/12/04 职场文书
见义勇为事迹材料
2014/12/24 职场文书
杜甫草堂导游词
2015/02/03 职场文书
会计专业自荐信范文
2015/03/05 职场文书
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android