數據索引和選取 pandas對象中的軸標簽信息有很多作用:
使用已知指示來確定數據(即提供元數據),這對於分析、可視化以及交互式控制台的顯示都十分重要 使能夠實現自動和顯式的數據對齊 允許直觀地獲取和設置數據集的子集 在這一部分,我們將致力於最終的目的:即如何切片,切丁以及一般地獲取和設置pandas對象的子集。文章將主要集中在Series和DataFrame上,因為它們潛力很大。希望未來在高維數據結構(包括panel)上投入更多的精力,尤其是在基於標簽的高級索引方面。
提示:Python和bumpy的索引操作[ ]和屬性操作. 為pandas數據結構提供了非常快速和簡便的方式。如果你已經知道如何操作Python字典和Numpy數組的話,這就沒什么新的了。然而,由於數據的類型無法提前預知,直接使用標准操作將會有一些優化的限制。對於產品代碼來說,我們建議你可以利用本文展示的優化的pandas數據使用方法。
警告:一個設置操作是會返回一個復制還是一個引用可能取決於具體情況。這種有時被稱為“鏈式賦值”,我們應當避免這種情況。
警告:在0.15.0版本中,與其他pandas對象一樣,index不再是ndarray的子類,而是PandasObject的子類。這個影響不大。
多樣的索引方法
為了實現更簡便的基於位置的索引,對象選取方法添加了一些用戶的請求。pandas現在支持三種類型的多軸索引。
.loc是最基本的基於標簽的索引,但是也可以用於布爾數組。當item無法找到時,.loc將會產生KeyError。合法的輸入有: 一個單獨的標簽,如5或“a”,(注意5是作為索引標簽,而不是一個整數的位置索引) 一個列表或者數組標簽[“a”,”b”,”c”] 一個帶有標簽“a”:“f”的切片對象(注意,與Python切片相反,這種切片的第一個和最后一個都包含在內!) 一個布爾數組 一個可調用的函數(調用Series, DataFrame或Panel)並返回索引的有效輸出(上面中的一個) .iloc是最基本的基於整數位置的索引(從軸的第0位到第length-1位),但是也可以用於布爾數組。除了允許超范圍索引的索引器之外,如果一個請求的索引超出了索引范圍,.iloc將會產生IndexError。合法的輸入有: 一個整數。如5 一個列表或整數數組。如[3,0,4] 一個整型的切片對象,如1:7 一個布爾數組 一個可調用的函數(調用Series, DataFrame或Panel)並返回索引的有效輸出(上面中的一個) .ix支持基於整數和標簽的混合索引。它主要是基於標簽的,但是除非對應的軸是整數類型,否則它將會回到整數位置進行訪問。.ix是最普適的,它能夠支持.loc和.iloc的任何輸入。.ix還支持浮點型的標簽。當處理基於位置和標簽的混合的層次索引時.ix特別有用。 然而,基於整數的軸只支持基於標簽的索引方式,而不支持基於位置的索引。因此,在此種情況下,使用.iloc或者.loc通常會
更加明確。
.loc, .iloc, .ix和[ ]索引能夠接受一個可調用對象作為索引器。 使用以下標記從一個多軸對象中獲取值(使用.loc為例,但同樣適用於.iloc和.ix)。任何的軸訪問器都可能是空的切片:假定不規范的軸。(如p.loc[‘a’]等價於p.loc[‘a’,:,:]) Object Type Indexers Series s.loc[indexer] DataFrame df.loc[row_indexer,column_indexer] Panel p.loc[item_indexer,major_indexer,minor_indexer] 基礎知識 正如在上一章節中介紹數據結構中所提到的那樣,使用[ ]進行索引的主要功能(相當於Python中的__getitem__)是選取出低維切片。因此, 對象類型 選取 返回值類型 Series series[label] 標量值 DataFrame frame[colname] 對應colname的 Series Panel panel[itemname] 對應itemname的DataFrame
這里我們構建了一個簡單的時間序列數據集來說明索引功能:
In [1]: dates = pd.date_range('1/1/2000', periods=8) In [2]: df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D']) In [3]: df Out[3]: A B C D 2000-01-01 0.469112 -0.282863 -1.509059 -1.135632 2000-01-02 1.212112 -0.173215 0.119209 -1.044236 2000-01-03 -0.861849 -2.104569 -0.494929 1.071804 2000-01-04 0.721555 -0.706771 -1.039575 0.271860 2000-01-05 -0.424972 0.567020 0.276232 -1.087401 2000-01-06 -0.673690 0.113648 -1.478427 0.524988 2000-01-07 0.404705 0.577046 -1.715002 -1.039268 2000-01-08 -0.370647 -1.157892 -1.344312 0.844885 In [4]: panel = pd.Panel({'one' : df, 'two' : df - df.mean()}) In [5]: panel Out[5]: <class 'pandas.core.panel.Panel'> Dimensions: 2 (items) x 8 (major_axis) x 4 (minor_axis) Items axis: one to two Major_axis axis: 2000-01-01 00:00:00 to 2000-01-08 00:00:00 Minor_axis axis: A to D 注意:除非特殊說明,所有的索引功能都是通用的,不只適用於該時間序列。 因此,根據上述,我們使用[ ]能夠實現最基本的索引: In [6]: s = df['A'] In [7]: s[dates[5]] Out[7]: -0.67368970808837059 In [8]: panel['two'] Out[8]: A B C D 2000-01-01 0.409571 0.113086 -0.610826 -0.936507 2000-01-02 1.152571 0.222735 1.017442 -0.845111 2000-01-03 -0.921390 -1.708620 0.403304 1.270929 2000-01-04 0.662014 -0.310822 -0.141342 0.470985 2000-01-05 -0.484513 0.962970 1.174465 -0.888276 2000-01-06 -0.733231 0.509598 -0.580194 0.724113 2000-01-07 0.345164 0.972995 -0.816769 -0.840143 2000-01-08 -0.430188 -0.761943 -0.446079 1.044010 你可以向[ ]中傳遞列的列表來按照順序選取多列。如果某列不再DataFrame中,將引發一個異常。也可以通過這種方式設置多個列。 In [9]: df Out[9]: A B C D 2000-01-01 0.469112 -0.282863 -1.509059 -1.135632 2000-01-02 1.212112 -0.173215 0.119209 -1.044236 2000-01-03 -0.8618492881064151 -2.104569 -0.494929 1.071804 2000-01-04 0.721555 -0.706771 -1.039575 0.271860 2000-01-05 -0.424972 0.567020 0.276232 -1.087401 2000-01-06 -0.673690 0.113648 -1.478427 0.524988 2000-01-07 0.404705 0.577046 -1.715002 -1.039268 2000-01-08 -0.370647 -1.157892 -1.344312 0.844885 In [10]: df[['B', 'A']] = df[['A', 'B’]] #交換兩個列的值 In [11]: df Out[11]: A B C D 2000-01-01 -0.282863 0.469112 -1.509059 -1.135632 2000-01-02 -0.173215 1.212112 0.119209 -1.044236 2000-01-03 -2.104569 -0.861849 -0.494929 1.071804 2000-01-04 -0.706771 0.721555 -1.039575 0.271860 2000-01-05 0.567020 -0.424972 0.276232 -1.087401 2000-01-06 0.113648 -0.673690 -1.478427 0.524988 2000-01-07 0.577046 0.404705 -1.715002 -1.039268 2000-01-08 -1.157892 -0.370647 -1.344312 0.844885
當將這種變換就地應用到列的子集的時候,你可能會發現這個方法的有用之處。
警告:當從.loc, .iloc和.ix設置Series和DataFrame時,pandas會將所有軸對齊。
這不會改變df,因為在賦值之前就進行了列對齊。
In [12]: df[['A', 'B']] Out[12]: A B 2000-01-01 -0.282863 0.469112 2000-01-02 -0.173215 1.212112 2000-01-03 -2.104569 -0.861849 2000-01-04 -0.706771 0.721555 2000-01-05 0.567020 -0.424972 2000-01-06 0.113648 -0.673690 2000-01-07 0.577046 0.404705 2000-01-08 -1.157892 -0.370647 In [13]: df.loc[:,['B', 'A']] = df[['A', 'B']]#這種方法無法使列A和列B的值對調 In [14]: df[['A', 'B']] Out[14]