详解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 05 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
Python DataFrame设置/更改列表字段/元素类型的方法
Jun 09 Python
解决nohup执行python程序log文件写入不及时的问题
Jan 14 Python
8种用Python实现线性回归的方法对比详解
Jul 10 Python
处理python中多线程与多进程中的数据共享问题
Jul 28 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
python 实现查询Neo4j多节点的多层关系
Dec 23 Python
selenium 多窗口切换的实现(windows)
Jan 18 Python
Jupyter Notebook添加代码自动补全功能的实现
Jan 07 Python
OpenCV全景图像拼接的实现示例
Jun 05 Python
python中redis包操作数据库的教程
Apr 19 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
php中如何防止表单的重复提交
2013/08/02 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
基于angularJS的表单验证指令介绍
2016/10/21 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
nodejs个人博客开发第七步 后台登陆
2017/04/12 NodeJs
jQuery查找和过滤_动力节点节点Java学院整理
2017/07/04 jQuery
fetch 如何实现请求数据
2018/12/20 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
Vue实现多页签组件
2021/01/14 Vue.js
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
python异步存储数据详解
2019/03/19 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
Django 批量插入数据的实现方法
2020/01/12 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
CSS3系列之3D制作方法案例
2017/08/14 HTML / CSS
HTML5 drag和drop具体使用详解
2021/01/18 HTML / CSS
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
销售类个人求职信范文
2013/09/25 职场文书
应用数学专业求职信
2014/03/14 职场文书
工作失职检讨书
2015/01/26 职场文书
python实现简单区块链结构
2021/04/25 Python
USB TYPE-C 或将成为所有智能手机充电标准
2022/04/21 数码科技
Nginx限流和黑名单配置
2022/05/20 Servers