詳解pandas中MultiIndex和對(duì)象實(shí)際索引不一致問(wèn)題
在最新版的pandas中(不知道之前的版本有沒(méi)有這個(gè)問(wèn)題),當(dāng)我們對(duì)具有多層次索引的對(duì)象做切片或者通過(guò)df[bool_list]的方式索引的時(shí)候,得到的新的對(duì)象盡管實(shí)際索引已經(jīng)發(fā)生了改變,但是當(dāng)直接使用df_new.index調(diào)取新對(duì)象的MultiIndex對(duì)象的時(shí)候,這個(gè)MultiIndex對(duì)象還是和原對(duì)象的索引保持一致的,而不是和新對(duì)象的實(shí)際索引保持一致。這點(diǎn)需要特別注意,因?yàn)檎G闆r下,我們自然會(huì)認(rèn)為df.index的MultiIndex對(duì)象和df的實(shí)際索引是一致的,基于此,我們可能會(huì)寫出一些難以發(fā)現(xiàn)的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對(duì)象的輸出結(jié)果和下面index的輸出結(jié)果可以發(fā)現(xiàn),df_t2的index和其實(shí)際的索引并不一致
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對(duì)象的輸出結(jié)果和下面index的輸出結(jié)果可以發(fā)現(xiàn),df_t3的index和其實(shí)際的索引也不一致
Out[47]:
MultiIndex(levels=[['a', 'b'], [0, 1]],
codes=[[0, 0], [0, 1]])
從上面的例子可以看出,當(dāng)通過(guò)bool索引和切片索引時(shí),就會(huì)出現(xiàn)這種問(wèn)題,其他的索引方式一般不會(huì)出現(xiàn)這種問(wèn)題。當(dāng)遇到這種問(wèn)題時(shí),如果我們需要始終保持新對(duì)象的index得到的對(duì)象和實(shí)際索引一致,該如何做呢?請(qǐng)看下面代碼
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對(duì)象有一個(gè)remove_unused_levels()函數(shù),其作用是把沒(méi)有被使用的索引被去處掉,這樣就可以使得對(duì)象的MultiIndex對(duì)象和其實(shí)際顯示出來(lái)的索引保持一致了。故其實(shí)在遇到多層次索引的切片索引或者bool索引之后,加上一條df.index.remove_unused_levels()語(yǔ)句不失為一個(gè)好的習(xí)慣,或者至少得有這種意識(shí),意識(shí)到此處可能會(huì)出現(xiàn)這種問(wèn)題。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python?Streamlit制作交互式可視化網(wǎng)頁(yè)應(yīng)用實(shí)例
這篇文章主要為大家介紹了Python?Streamlit制作交互式可視化網(wǎng)頁(yè)應(yīng)用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
python實(shí)現(xiàn)圖像識(shí)別功能
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖像識(shí)別功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Python簡(jiǎn)單的制作圖片驗(yàn)證碼實(shí)例
本篇文章主要介紹了Python簡(jiǎn)單的制作圖片驗(yàn)證碼實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
Python實(shí)現(xiàn)自動(dòng)計(jì)算Excel數(shù)據(jù)指定范圍內(nèi)的區(qū)間最大值
這篇文章主要為大家詳細(xì)介紹了如何基于Python自動(dòng)計(jì)算Excel數(shù)據(jù)指定范圍內(nèi)的區(qū)間最大值,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以了解下2023-07-07
python?面向?qū)ο箝_(kāi)發(fā)及基本特征
面向?qū)ο缶幊淌且环N編程方式,此編程方式的落地需要使用“類”和 “對(duì)象”來(lái)實(shí)現(xiàn),所以,面向?qū)ο缶幊唐鋵?shí)就是對(duì) “類”和“對(duì)象” 的使用,今天給大家介紹下python?面向?qū)ο箝_(kāi)發(fā)及基本特征,感興趣的朋友一起看看吧2022-03-03
Pytorch框架構(gòu)建ResNet模型的實(shí)現(xiàn)示例
本文主要介紹了Pytorch框架構(gòu)建ResNet模型的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06
詳解pycharm2020.1.1專業(yè)版安裝指南(推薦)
Python如何利用opencv實(shí)現(xiàn)手勢(shì)識(shí)別
Python異常原理及異常捕捉實(shí)現(xiàn)過(guò)程解析

