详解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程序的执行原理
Apr 11 Python
简单谈谈Python中的json与pickle
Jul 19 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
Python图像处理之简单画板实现方法示例
Aug 30 Python
Python倒排索引之查找包含某主题或单词的文件
Nov 13 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
Python爬虫实现模拟点击动态页面
Mar 05 Python
Python实现进度条和时间预估的示例代码
Jun 02 Python
python获取时间戳的实现示例(10位和13位)
Sep 23 Python
python 调用js的四种方式
Apr 11 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
Python matplotlib 利用随机函数生成变化图形
Apr 26 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取整的几种方式
2013/06/25 PHP
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
php采集神器cURL使用方法详解
2016/02/19 PHP
php curl常用的5个经典例子
2017/01/20 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
javascript 极速 隐藏/显示万行表格列只需 60毫秒
2009/03/28 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
javascript中类的定义方式详解(四种方式)
2015/12/22 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
详谈$.data()的用法和作用
2017/02/13 Javascript
基于vue+ bootstrap实现图片上传图片展示功能
2017/05/17 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
浅谈angularJs函数的使用方法(大小写转换,拷贝,扩充对象)
2018/10/08 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
github配置使用指南
2014/11/18 Python
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
python写一个随机点名软件的实例
2019/11/28 Python
亚洲在线旅行门户网站:Expedia.com.hk(智游网)
2020/04/14 全球购物
银行会计财务工作个人的自我评价
2013/10/29 职场文书
科室工作的个人自我评价
2013/10/30 职场文书
青春演讲稿范文
2014/05/08 职场文书
财务负责人岗位职责
2015/02/03 职场文书
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS