详解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
0
投稿
猜你喜欢
- 很多小伙伴都会有这样的问题,说一个ip地址十分钟内之内注册一次,用来防止用户来重复注册带来不必要的麻烦逻辑:取ip,在数据库找ip是否存在,
- 本文研究的主要是Python subprocess模块的相关内容,具体如下。在学习这个模块前,我们先用Python的help()函数查看一下
- 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的 * ,从而保证爬虫快
- 总的来讲,JavaSever PagesTM(JSP)和 微软的Active Sever Pages(ASP)在技术方面有许多相似之处。两者
- RSA算法RSA算法是一种公钥加密技术,被认为是最安全的加密方式.它是由Rivest,Shamir和Adleman于1978年发明的,因此命
- 本文主要给大家讲解了Apriori算法的基础知识以及Apriori算法python中的实现过程,以下是所有内容:1. Apriori算法简介
- 其实各大深度学习框架背后的原理都可以理解为拟合一个参数数量特别庞大的函数,所以各框架都能用来拟合任意函数,Pytorch也能。在这篇博客中,
- 代码如下import unittestdir = "D:\\work_doc\\pycharm2\\python_Basics&q
- 原始结构:Column1 Column2----------- ----------1 A1 B2 C2 D2 E3 F查询效果:Colum
- 嗯,你可以说我很无聊。最近疯狂加班,今天才得以有时间搞一个CSS的像素图来消遣休息下。先看效果:运行代码框<!DOCTYPE html
- 最近研究研究了css,少不了去网上分析一下别人的网页, 但很多网站的css文件都是要么写在一行,要么一个换行都没有,看起来极其痛苦,所以写一
- 随着同时开发的项目越来越多,需要不停的在各个不同版本的 python 环境之间切换,所以想到了pyenv。以前一直使用的 vir
- 前言python对动态验证码、滑动验证码的降噪和识别,在各种自动化操作中,我们经常要遇到沿跳过验证码的操作,而对于验证码的降噪和识别,的确困
- 该爬虫应用了创建文件夹的功能:#file settingfolder_path = "D:/spider_things/2016.
- 一、设置画布turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置turtle.screensize(canvwidth=600
- “到底是什么将艺术和设计分开的?”这样一个话题听起来费解,长时间以来, 也已经被讨论过无数次。艺术家和设计师都是通过共通的知识和素养来创造视
- 源码及注释:import pygamefrom sys import exitfrom random import randintimpor
- 安装模块1、找到对应的模块 http://www.python-excel.org/2、用pip install 安
- <div> <a 
- 最近在看《Effective Python》,里面提到判断字符串或者集合是否为空的原则,原文如下:Don't check for e