详解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 相关文章推荐
使用Node.js和Socket.IO扩展Django的实时处理功能
Apr 20 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
小小聊天室Python代码实现
Aug 17 Python
Python 基础知识之字符串处理
Jan 06 Python
Python基于百度云文字识别API
Dec 13 Python
python发送多人邮件没有展示收件人问题的解决方法
Jun 21 Python
如何使用Python实现斐波那契数列
Jul 02 Python
python使用matplotlib绘制雷达图
Oct 18 Python
基于Python中的yield表达式介绍
Nov 19 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
Feb 13 Python
Python time库的时间时钟处理
May 02 Python
pytorch中的numel函数用法说明
May 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的面向对象编程
2006/10/09 PHP
MySQL数据源表结构图示
2008/06/05 PHP
php中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
Javascript浅谈之this
2013/12/17 Javascript
java、javascript实现附件下载示例
2014/08/14 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
第一次接触神奇的Bootstrap导航条
2016/08/09 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
JavaScript输入框字数实时统计更新
2017/06/17 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
详解JSON Web Token 入门教程
2018/07/30 Javascript
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
2014/04/08 Python
Python实现快速多线程ping的方法
2015/07/15 Python
Python 实现try重新执行
2019/12/21 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
Python中有几个关键字
2020/06/04 Python
全球性的在线购物网站:Zapals
2017/03/22 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
工作表现评语
2014/01/19 职场文书
年度考核自我评价
2014/01/25 职场文书
秋季开学典礼主持词
2014/03/19 职场文书
小摄影师教学反思
2014/04/27 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
高校自主招生教师推荐信
2015/03/23 职场文书
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers