這篇文章將為大家詳細(xì)講解有關(guān)如何在pandas中使用ix,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到巴宜網(wǎng)站設(shè)計(jì)與巴宜網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類(lèi)型包括:成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、主機(jī)域名、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋巴宜地區(qū)。首先,再次介紹這三種方法的概述:
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一樣的行為。(這句話有些繞口,沒(méi)關(guān)系,關(guān)于ix特點(diǎn),后面會(huì)詳細(xì)講解)
1 使用ix切分Series
請(qǐng)注意:在pandas版本0.20.0及其以后版本中,ix已經(jīng)不被推薦使用,建議采用iloc和loc實(shí)現(xiàn)ix。這是為什么呢?這是由于ix的復(fù)雜特點(diǎn)可能使ix使用起來(lái)有些棘手:
如果索引是整數(shù)類(lèi)型,則ix將僅使用基于標(biāo)簽的索引,而不會(huì)回退到基于位置的索引。如果標(biāo)簽不在索引中,則會(huì)引發(fā)錯(cuò)誤。
如果索引不僅包含整數(shù),則給定一個(gè)整數(shù),ix將立即使用基于位置的索引而不是基于標(biāo)簽的索引。但是,如果ix被賦予另一種類(lèi)型(例如字符串),則它可以使用基于標(biāo)簽的索引。
接下來(lái)舉例說(shuō)明這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)在我們來(lái)看使用整數(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。
如果,我們?cè)噲D去找一個(gè)不在索引中的標(biāo)簽,比如說(shuō)是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ò)的原因是什么呢?正如我們?cè)趇x的特點(diǎn)1所說(shuō)的那樣,如果索引只有整數(shù)類(lèi)型,那么ix僅使用基于標(biāo)簽的索引,而不會(huì)回退到基于位置的索引。如果標(biāo)簽不在索引中,則會(huì)引發(fā)錯(cuò)誤。
1.2 特點(diǎn)2舉例
接著例子1來(lái)說(shuō),如果我們的索引是一個(gè)混合的類(lèi)型,即不僅僅包括整型,也包括其他類(lèi)型,如字符類(lèi)型。那么,給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è)例子就說(shuō)明了ix特點(diǎn)2。
正如前面所介紹的,ix的使用有些復(fù)雜。如果僅使用位置或者標(biāo)簽進(jìn)行切片,使用iloc或者loc就行了,請(qǐng)避免使用ix。
2 在Dataframe中使用ix實(shí)現(xiàn)復(fù)雜切片
有時(shí)候,在使用Dataframe進(jìn)行切片時(shí),我們想混合使用標(biāo)簽和位置來(lái)對(duì)行和列進(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)簽來(lái)切分行,使用位置來(lái)切分列(請(qǐng)注意:因?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的后來(lái)版本中,我們可以使用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)簽在索引中的位置的方法。請(qǐng)注意,因?yàn)槭褂胕loc切片時(shí)不包括最后1個(gè)點(diǎn),因?yàn)槲覀儽仨毤?。
可以看到,只使用iloc更好用,因?yàn)椴槐乩頃?huì)ix的那2個(gè)“繁瑣”的特點(diǎn)。
關(guān)于如何在pandas中使用ix就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。