详解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实现的HTTP并发测试完整示例
Apr 23 Python
Python实现栈的方法
May 26 Python
在 Python 应用中使用 MongoDB的方法
Jan 05 Python
Python自动化运维之IP地址处理模块详解
Dec 10 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
python 信息同时输出到控制台与文件的实例讲解
May 11 Python
python版opencv摄像头人脸实时检测方法
Aug 03 Python
python-视频分帧&多帧合成视频实例
Dec 10 Python
python 实现屏幕录制示例
Dec 23 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
Jan 21 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
python关于倒排列的知识点总结
Oct 13 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语法小结之基础和变量
2015/11/22 PHP
解决Yii2邮件发送结果返回成功,但接收不到邮件的问题
2017/05/23 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
用JavaScript实现仿Windows关机效果
2007/03/10 Javascript
var与Javascript变量隐式声明
2009/09/17 Javascript
js 实现复制到粘贴板的功能代码
2010/05/13 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
jquery插件unobtrusive实现片段式加载
2015/06/15 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
jquery.validate表单验证插件使用详解
2017/06/21 jQuery
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
python定时器(Timer)用法简单实例
2015/06/04 Python
浅谈Python对内存的使用(深浅拷贝)
2018/01/17 Python
python针对excel的操作技巧
2018/03/13 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
Django实现跨域的2种方法
2019/07/31 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
python保留小数位的三种实现方法
2020/01/07 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
Why do we need Unit test
2013/01/03 面试题
幼师自我鉴定
2014/02/01 职场文书
服务理念标语
2014/06/18 职场文书
公司管理制度范本
2015/08/03 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书
python实现简单倒计时功能
2021/04/21 Python
vue引入Excel表格插件的方法
2021/04/28 Vue.js
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android
MySQL数据库10秒内插入百万条数据的实现
2021/11/01 MySQL
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers