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

 更新时间:2019年07月23日 14:17:29   作者:S_o_l_o_n  
这篇文章主要介绍了详解pandas中MultiIndex和对象实际索引不一致问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在最新版的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爬虫爬取杭州24时温度并展示操作示例

    Python爬虫爬取杭州24时温度并展示操作示例

    这篇文章主要介绍了Python爬虫爬取杭州24时温度并展示操作,结合实例形式分析了Python爬虫进行页面爬取与数据分析、展示相关操作技巧,需要的朋友可以参考下
    2020-03-03
  • python的重要技能输入与输出字符串格式化使用详解

    python的重要技能输入与输出字符串格式化使用详解

    这篇文章主要为大家介绍了python的重要技能输入与输出格式化使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Python使用chardet判断字符编码

    Python使用chardet判断字符编码

    这篇文章主要介绍了Python使用chardet判断字符编码的方法,较为详细的分析了Python中chardet的功能、安装及使用技巧,需要的朋友可以参考下
    2015-05-05
  • Python grequests模块使用场景及代码实例

    Python grequests模块使用场景及代码实例

    这篇文章主要介绍了Python grequests模块使用场景及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Python学习之asyncore模块用法实例教程

    Python学习之asyncore模块用法实例教程

    这篇文章主要介绍了Python学习之asyncore模块用法,主要讲述了asyncore模块的组成、原理及相关函数的用法,对于使用Python进行网络编程来说非常实用,需要的朋友可以参考下
    2014-09-09
  • Django在视图中使用表单并和数据库进行数据交互的实现

    Django在视图中使用表单并和数据库进行数据交互的实现

    本文主要介绍了Django在视图中使用表单并和数据库进行数据交互,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 用Python的Django框架编写从Google Adsense中获得报表的应用

    用Python的Django框架编写从Google Adsense中获得报表的应用

    这篇文章主要介绍了用Python的Django框架编写从Google Adsense中获得报表的应用,主要利用了官方的Google Adsense API,需要的朋友可以参考下
    2015-04-04
  • Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度

    Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度

    Matplotlib是Python提供的一个二维绘图库,所有类型的平面图,包括直方图、散点图、折线图、点图、热图以及其他各种类型,都能由Python制作出来。本文主要介绍了关于Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度的相关资料,需要的朋友可以参考下。
    2018-04-04
  • 解决Django Static内容不能加载显示的问题

    解决Django Static内容不能加载显示的问题

    今天小编就为大家分享一篇解决Django Static内容不能加载显示的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python中三种命令行参数利用方式详解

    Python中三种命令行参数利用方式详解

    Python的命令行参数,提供了很多有用的功能,可以方便调试和运行,这篇文章主要给大家介绍了关于Python中三种命令行参数利用方式的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12

最新评论