详解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基础教程之基本内置数据类型介绍
Feb 20 Python
python 远程统计文件代码分享
May 14 Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 Python
Python 循环语句之 while,for语句详解
Apr 23 Python
python opencv 二值化 计算白色像素点的实例
Jul 03 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
Oct 24 Python
基于python中__add__函数的用法
Nov 25 Python
Django认证系统user对象实现过程解析
Mar 02 Python
使用python matploblib库绘制准确率,损失率折线图
Jun 16 Python
Python读写csv文件流程及异常解决
Oct 20 Python
python3实现Dijkstra算法最短路径的实现
May 12 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中文汉字验证码
2007/04/08 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
PHP中strtotime函数使用方法详解
2011/11/27 PHP
PHP编程函数安全篇
2013/01/08 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
node.js中的console.error方法使用说明
2014/12/10 Javascript
PHP 数组current和next用法分享
2015/03/05 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
AngularJS的Filter的示例详解
2017/03/07 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
python安装与使用redis的方法
2016/04/19 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
一份python入门应该看的学习资料
2018/04/11 Python
Python requests发送post请求的一些疑点
2018/05/20 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
Django中Q查询及Q()对象 F查询及F()对象用法
2020/07/09 Python
用python读取xlsx文件
2020/12/17 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
详解移动端Html5页面中1px边框的几种解决方法
2018/07/24 HTML / CSS
台湾最大网路书店:博客来
2018/03/18 全球购物
大学毕业感言
2014/01/10 职场文书
大学生通用个人的自我评价
2014/02/10 职场文书
学校消防安全责任书
2014/07/23 职场文书
党的群众路线学习笔记
2014/11/06 职场文书
师德先进个人材料
2014/12/20 职场文书
2019辞职报告范本3篇!
2019/07/23 职场文书
python基础学习之递归函数知识总结
2021/05/26 Python
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript