pandas中ix的使用詳細(xì)講解
在上一篇博客中,我們已經(jīng)仔細(xì)講解了iloc和loc,只是簡單了提到了ix。這是因?yàn)橄啾扔谇?者,ix更復(fù)雜,也更讓人迷惑。
因此,本篇博客通過例子的解釋試圖來描述清楚ix,尤其是與iloc和loc的聯(lián)系。
首先,再次介紹這三種方法的概述:
- loc gets rows (or columns) with particular labels from the index. loc從索引中獲取具有特定標(biāo)簽的行(或列)。
- iloc gets rows (or columns) at particular positions in the index (so it only takes integers). iloc在索引中的特定位置獲取行(或列)(因此它只接受整數(shù))。
- ix usually tries to behave like loc but falls back to behaving like iloc if a label is not present in the index. ix通常會(huì)嘗試像loc一樣行為,但如果索引中不存在標(biāo)簽,則會(huì)退回到像iloc一樣的行為。(這句話有些繞口,沒關(guān)系,關(guān)于ix特點(diǎn),后面會(huì)詳細(xì)講解)
1 使用ix切分Series
請注意:在pandas版本0.20.0及其以后版本中,ix已經(jīng)不被推薦使用,建議采用iloc和loc實(shí)現(xiàn)ix。這是為什么呢?這是由于ix的復(fù)雜特點(diǎn)可能使ix使用起來有些棘手:
- 如果索引是整數(shù)類型,則ix將僅使用基于標(biāo)簽的索引,而不會(huì)回退到基于位置的索引。如果標(biāo)簽不在索引中,則會(huì)引發(fā)錯(cuò)誤。
- 如果索引不僅包含整數(shù),則給定一個(gè)整數(shù),ix將立即使用基于位置的索引而不是基于標(biāo)簽的索引。但是,如果ix被賦予另一種類型(例如字符串),則它可以使用基于標(biāo)簽的索引。
接下來舉例說明這2個(gè)特點(diǎn)。
1.1 特點(diǎn)1舉例
>>> s = pd.Series(np.nan, index=[49,48,47,46,45, 1, 2, 3, 4, 5]) >>> s 49 NaN 48 NaN 47 NaN 46 NaN 45 NaN 1 NaN 2 NaN 3 NaN 4 NaN 5 NaN
現(xiàn)在我們來看使用整數(shù)3切片有什么結(jié)果:
在這個(gè)例子中,s.iloc[:3]讀取前3行(因?yàn)閕loc把3看成是位置position),而s.loc[:3]讀取的是前8行(因?yàn)閘oc把3看作是索引的標(biāo)簽label)
>>> s.iloc[:3] # slice the first three rows 49 NaN 48 NaN 47 NaN >>> s.loc[:3] # slice up to and including label 3 49 NaN 48 NaN 47 NaN 46 NaN 45 NaN 1 NaN 2 NaN 3 NaN >>> s.ix[:3] # the integer is in the index so s.ix[:3] works like loc 49 NaN 48 NaN 47 NaN 46 NaN 45 NaN 1 NaN 2 NaN 3 NaN
注意:s.ix[:3]返回的結(jié)果與s.loc[:3]一樣,這是因?yàn)槿绻鹲eries的索引是整型的話,ix會(huì)首先去尋找索引中的標(biāo)簽3而不是去找位置3。
如果,我們試圖去找一個(gè)不在索引中的標(biāo)簽,比如說是6呢?
>>> s.iloc[:6] 49 NaN 48 NaN 47 NaN 46 NaN 45 NaN 1 NaN >>> s.loc[:6] KeyError: 6 >>> s.ix[:6] KeyError: 6
在上面的例子中,s.iloc[:6]正如我們所期望的,返回了前6行。而,s.loc[:6]返回了KeyError錯(cuò)誤,這是因?yàn)闃?biāo)簽6并不在索引中。
那么,s.ix[:6]報(bào)錯(cuò)的原因是什么呢?正如我們在ix的特點(diǎn)1所說的那樣,如果索引只有整數(shù)類型,那么ix僅使用基于標(biāo)簽的索引,而不會(huì)回退到基于位置的索引。如果標(biāo)簽不在索引中,則會(huì)引發(fā)錯(cuò)誤。
1.2 特點(diǎn)2舉例
接著例子1來說,如果我們的索引是一個(gè)混合的類型,即不僅僅包括整型,也包括其他類型,如字符類型。那么,給ix一個(gè)整型數(shù)字,ix會(huì)立即使用iloc操作,而不是報(bào)KeyError錯(cuò)誤。
>>> s2 = pd.Series(np.nan, index=['a','b','c','d','e', 1, 2, 3, 4, 5]) >>> s2.index.is_mixed() # index is mix of different types True >>> s2.ix[:6] # now behaves like iloc given integer a NaN b NaN c NaN d NaN e NaN 1 NaN
注意:在這種情況下,ix也可以接受非整型,這樣就是loc的操作:
>>> s2.ix[:'c'] # behaves like loc given non-integer a NaN b NaN c NaN
這個(gè)例子就說明了ix特點(diǎn)2。
正如前面所介紹的,ix的使用有些復(fù)雜。如果僅使用位置或者標(biāo)簽進(jìn)行切片,使用iloc或者loc就行了,請避免使用ix。
2 在Dataframe中使用ix實(shí)現(xiàn)復(fù)雜切片
有時(shí)候,在使用Dataframe進(jìn)行切片時(shí),我們想混合使用標(biāo)簽和位置來對行和列進(jìn)行切片。那么,應(yīng)該怎么操作呢?
舉例,考慮有下述例子中的Dataframe。我們想得到直到包含標(biāo)簽'c'的行和前4列。
>>> df = pd.DataFrame(np.nan, index=list('abcde'), columns=['x','y','z', 8, 9]) >>> df x y z 8 9 a NaN NaN NaN NaN NaN b NaN NaN NaN NaN NaN c NaN NaN NaN NaN NaN d NaN NaN NaN NaN NaN e NaN NaN NaN NaN NaN
在pandas的早期版本(0.20.0)之前,ix可以很好地實(shí)現(xiàn)這個(gè)功能。
我們可以使用標(biāo)簽來切分行,使用位置來切分列(請注意:因?yàn)?并不是列的名字,因?yàn)閕x在列上是使用的iloc)。
>>> df.ix[:'c', :4] x y z 8 a NaN NaN NaN NaN b NaN NaN NaN NaN c NaN NaN NaN NaN
在pandas的后來版本中,我們可以使用iloc和其它的一個(gè)方法就可以實(shí)現(xiàn)上述功能:
>>> df.iloc[:df.index.get_loc('c') + 1, :4] x y z 8 a NaN NaN NaN NaN b NaN NaN NaN NaN c NaN NaN NaN NaN
get_loc() 是得到標(biāo)簽在索引中的位置的方法。請注意,因?yàn)槭褂胕loc切片時(shí)不包括最后1個(gè)點(diǎn),因?yàn)槲覀儽仨毤?。
可以看到,只使用iloc更好用,因?yàn)椴槐乩頃?huì)ix的那2個(gè)“繁瑣”的特點(diǎn)。
3 參考文獻(xiàn)
https://stackoverflow.com/questions/31593201/pandas-iloc-vs-ix-vs-loc-explanation-how-are-they-different
到此這篇關(guān)于pandas中ix的使用詳細(xì)講解的文章就介紹到這了,更多相關(guān)pandas ix內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python異常處理機(jī)制結(jié)構(gòu)實(shí)例解析
這篇文章主要介紹了Python異常處理機(jī)制結(jié)構(gòu)實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07教你使用Python實(shí)現(xiàn)一個(gè)簡易版Web服務(wù)器
這篇文章主要介紹了教你使用Python實(shí)現(xiàn)一個(gè)簡易版Web服務(wù)器,本篇文章將通過實(shí)現(xiàn)一個(gè)簡易版的Web服務(wù)器,幫助讀者理解Python網(wǎng)絡(luò)編程的基本概念和技巧,需要的朋友可以參考下2023-04-04Python實(shí)現(xiàn)的多線程同步與互斥鎖功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)的多線程同步與互斥鎖功能,涉及Python多線程及鎖機(jī)制相關(guān)操作技巧,需要的朋友可以參考下2017-11-11tensorflow官方github預(yù)訓(xùn)練模型下載方式
這篇文章主要介紹了tensorflow官方github預(yù)訓(xùn)練模型下載方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Python學(xué)習(xí)之列表常用方法總結(jié)
這篇文章主要為大家介紹了Python中列表的幾個(gè)常用方法總結(jié),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python列表有一定幫助,需要的可以參考一下2022-03-03python搭建簡易服務(wù)器分析與實(shí)現(xiàn)
本文將介紹python搭建簡易服務(wù)器實(shí)現(xiàn)步驟,需要了解的朋友可以參考下2012-12-12Python可變與不可變數(shù)據(jù)和深拷貝與淺拷貝
這篇文章主要介紹了Python可變與不可變數(shù)據(jù)和深拷貝與淺拷貝,拷貝函數(shù)是專門為可變數(shù)據(jù)類型list、set、dict使用的一種函數(shù),更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下2022-04-04Python中apply函數(shù)的用法實(shí)例教程
這篇文章主要介紹了Python中apply函數(shù)的用法,配合實(shí)例解說,可加深讀者對apply函數(shù)的理解,需要的朋友可以參考下2014-07-07