详解pandas中MultiIndex和对象实际索引不一致问题

yipeiwu_com5年前Python基础

在最新版的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设计】。

相关文章

在cmd中查看python的安装路径方法

在cmd中查看python的安装路径方法

我相信一定有很多的人跟我一样,经常忘记Python安装的路径,每当用到的时候,最笨的办法就是在全局电脑里,直接查找Python,这样是肯定能查到的,但是如果你的电脑文件超级多,这将是一个...

使用Python解析JSON数据的基本方法

Python的json模块提供了一种很简单的方式来编码和解码JSON数据。 其中两个主要的函数是 json.dumps() 和 json.loads() , 要比其他序列化函数库如pic...

解析Python中while true的使用

无限循环 如果条件判断语句永远为 true,循环将会无限的执行下去,如下实例: #!/usr/bin/python # -*- coding: UTF-8 -*- var = 1...

python+opencv实现动态物体追踪

python+opencv实现动态物体追踪

简单几行就可以实现对动态物体的追踪,足见opencv在图像处理上的强大。 python代码: import cv2 import numpy as np camera=cv2.V...

python 读取excel文件生成sql文件实例详解

python 读取excel文件生成sql文件实例详解 学了python这么久,总算是在工作中用到一次。这次是为了从excel文件中读取数据然后写入到数据库中。这个逻辑用java来写的话...