详解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 Socket网络编程
Jan 05 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
利用Python循环(包括while&for)各种打印九九乘法表的实例
Nov 06 Python
python 删除指定时间间隔之前的文件实例
Apr 24 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
django foreignkey外键使用的例子 相当于left join
Aug 06 Python
在macOS上搭建python环境的实现方法
Aug 13 Python
基于Python爬虫采集天气网实时信息
Jun 05 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
Jun 28 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
python和node.js生成当前时间戳的示例
Sep 29 Python
python 如何对logging日志封装
Dec 02 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
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
探讨php define()函数及defined()函数使用详解
2013/06/09 PHP
php获取图片信息的方法详解
2015/12/10 PHP
PHP 对象继承原理与简单用法示例
2020/04/21 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
javascript与CSS复习(三)
2010/06/29 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
jQuery ui插件的使用方法代码实例
2013/05/08 Javascript
JQuery+Ajax无刷新分页的实例代码
2014/02/08 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
自制简易打赏功能的实例
2017/09/02 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
Python入门篇之字典
2014/10/17 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
关于Python数据结构中字典的心得
2017/12/04 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
python3 tkinter实现点击一个按钮跳出另一个窗口的方法
2019/06/13 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
python实现PDF中表格转化为Excel的方法
2020/06/16 Python
Python json格式化打印实现过程解析
2020/07/21 Python
Python实现自动整理文件的脚本
2020/12/17 Python
css3之UI元素状态伪类选择器实例演示
2017/08/11 HTML / CSS
CK美国官网:Calvin Klein
2016/08/26 全球购物
英国知名的皮手套品牌:Dents
2016/11/13 全球购物
匡威英国官网:Converse英国
2018/12/02 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
有个性的自我评价范文
2013/11/15 职场文书
小区门卫岗位职责
2013/12/31 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
《维生素c的故事》教学反思
2014/02/18 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
超市员工辞职信范文
2015/05/12 职场文书