详解pandas中MultiIndex和对象实际索引不一致问题
作者:S_o_l_o_n 发布时间:2021-07-10 20:43:27
标签: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()语句不失为一个好的习惯,或者至少得有这种意识,意识到此处可能会出现这种问题。
来源:https://blog.csdn.net/S_o_l_o_n/article/details/88191908


猜你喜欢
- 第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysql语法如下: mysql -
- 问题:导入数据时是否需要禁用索引?解答:在使用load data导入数据时,如果导入的表是MyISAM的,对于空表,MySQL数据库会把所有
- 协程协程(co-routine,又称微线程)是一种多方协同的工作方式。当前执行者在某个时刻主动让出(yield)控制流,并记住自身当前的状态
- 本文实例讲述了Sanic框架请求与响应。分享给大家供大家参考,具体如下:前面介绍了Sanic框架的路由,这里接着介绍Sanic框架的请求与响
- Python在字符串格式化的两种方式%format%,关于整数的输出%o:oct 八进制%d:dec 十进制%x:hex 十六进制print
- 有一个优秀的库可以使用————demjson示范链接http
- 第七步: 在自定义分页的Repeater 里添加排序功能现在已经完成了自定义分页,我们再来添加排序功能。ProductsBLL类的GetPr
- 如今,体育运动的热潮日益流行。同样,以不正确的方式进行运动的风险也在增加。有时可能会导致严重的伤害。考虑到这些原因,提出一种以分析运动员的关
- 关于Pytorch中怎么自定义Dataset数据集类、怎样使用DataLoader迭代加载数据,这篇官方文档已经说得很清楚了,这里就不在赘述
- function toBreakWord(intLen, id){ var obj=document.getElementById(id);
- 为了将excel数据自动转换成所需要的erlang数据,听同事说使用python会很方便简单,就自学了两天python,写了一个比较粗糙的p
- 计算机键盘每天用得太多了,以致于我们无视它的存在(盲打),当然也很少有人去问这样一个问题——为什么键盘字母的排列方式是QWERTY而不是AB
- 前言写过 CLI 常驻进程的老司机肯定遇到过这么一个问题:在需要更新程序的时候,我要怎样才能安全关闭老进程?你可能会想到 NGIN
- 字典的创建名称={”键名“:”键值“}举例:person={
- 输入框Input 应当符合逻辑地划分为小组,这样大脑就可以很好的处理大堆区域间的关系。 ——《HTML权威指南》Web 应用程序总是利用表单
- 经常会有人问我, PHP的数组, 如果用foreach来访问, 遍历的顺序是固定的么? 以什么顺序遍历呢? 比如: <?php $ar
- 需求:Python实现三次密码验证,每次验证结果需要提示,三次验证不通过需要单独提示代码如下:user = '张无忌'pas
- Scrapy框架简单介绍Scrapy框架是一个基于Twisted的异步处理框架,是纯Python实现的爬虫框架,是提取结构性数据而编写的应用
- 目录前言1-下载python3.8压缩包2-解压缩安装包3-安装依赖工具4-安装python3.85-修改python2软链接6-修改yum
- <!DOCTYPE html><html lang="en"><head> <