详解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 相关文章推荐
解决Django模板无法使用perms变量问题的方法
Sep 10 Python
Python工程师面试必备25条知识点
Jan 17 Python
python和shell监控linux服务器的详细代码
Jun 22 Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 Python
解决python中无法自动补全代码的问题
Dec 04 Python
django Admin文档生成器使用详解
Jul 22 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
Mar 09 Python
更新升级python和pip版本后不生效的问题解决
Apr 17 Python
Python打印特殊符号及对应编码解析
May 07 Python
Spark处理数据排序问题如何避免OOM
May 21 Python
Python实现排序方法常见的四种
Jul 15 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实现多级树型菜单
2006/10/09 PHP
PHP微信公众号自动发送红包API
2016/06/01 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
Node.js中的模块机制学习笔记
2014/11/04 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
jquery实现删除一个元素后面的所有元素功能
2015/12/21 Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
2015/12/26 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
jQuery 移除事件的方法
2020/06/20 jQuery
[39:53]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.19
2020/11/19 DOTA
python3.x上post发送json数据
2018/03/04 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
《秋姑娘的信》教学反思
2014/02/28 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
公诉意见书范文
2015/06/05 职场文书
2016干部作风整顿心得体会
2016/01/22 职场文书
选对餐饮营销策略,营业额才会上涨
2019/08/27 职场文书
进行数据处理的6个 Python 代码块分享
2022/04/06 Python