在Pandas的Series或DataFrame中,每個資料都會被標記在Index物件。該物件為資料的每一列與欄位提供了有意義的標籤(label),讓我們可以利用這些標籤來選取資料。除了利用標籤選取資料外,我們也可根據列與欄位的位置(position)來選取資料。雙重的資料選取方式(使用標籤或位置)雖然帶來了許多好處,但有時卻會造成使用者的困惑。接下來,就讓我們以一些範例進行說明吧!
首先,來創建一個內含5筆資料的簡單Series,並顯示其內容:
在預設情況下,創建出的Series會以從0開始的整數編號為其索引標籤,讓我們將其索引標籤改為英文字母:
目前,我們已經得到一個索引標籤為英文字母的Series。接下來,讓我們嘗試以不同的方法來取出『Keelung』這筆資料吧!我們可以直接用將特定的索引標籤放到[ ],即Python的索引算符中,進而選取資料,如下所示:
我們也可使用loc屬性,並按照索引標籤來做到相同的事情:
以上示範的兩種方式都是按照標籤來選取資料。當然,我們也可以按照資料所在的位置來選取它。在該Series中,『Keelung』是首筆資料,因此其位置數字為0。我們可以直接將0傳入[ ]算符來選取該筆資料:
註:此處需留意,我們是傳入整數0,而非字串'0',否則就會變成選取索引標籤為0的資料了!
此外,將整數0傳入iloc屬性也可取得同樣的結果:
目前看來,直接對Series使用[ ]算符似乎是比較好的選擇,因為你可以同時按標籤或位置來選取資料(在以上範例中,data['a']和data[0]的效果是一樣的)。不過,建議讀者盡可能避免使用這種方式,因為其並沒有明確表示是用何種方式(標籤或位置)來選取資料。有的時候,這會讓您掉入陷阱。
為了具體說明其中的陷阱,讓我們先將以上Series的索引標籤改為整數:
註:此處我們是透過整數串列來修改索引標籤,而非諸如['1', '3', '5', '7', '9']的數字字串串列。
讓我們嘗試搭配[ ]算符和索引標籤來選取資料。請注意,由於現在的索引標籤為整數,因此我們傳入的是整數,而非整數字串:
假設現在我們想用[ ]算符選取位置數字為3的資料(即:『Taichung』),那會發生什麼事呢?
由於Series中也有索引標籤為3的資料(即:『Taipei』),因此Pandas選取的是該資料,而非位置數字為3的『Taichung』。
從以上程式輸出可見,若Series使用整數值為索引標籤時,會與Python的索引位置(同樣用整數表示)發生衝突。由於這並不會顯示任何的錯誤訊息,因此在不了解資料的前提下,您很可能會選取到錯誤的資料,進而掉入陷阱
相反地,使用loc屬性或iloc屬性就沒有這個問題,因為前者一定是以標籤進行選取,而後者一定是以位置進行選取。現在,使用loc屬性選取索引標籤為整數1的資料:
接著,使用iloc屬性來選取位置數字為1的資料(即:『Taipei』)。
到這裡我們可以發現,使用loc屬性和iloc屬性來選擇資料是非常明確的,可避免我們選取錯誤的資料。不過,使用這兩個屬性進行切片(slicing)操作時也有需要格外留意的地方。由於篇幅的關係,這裡就不一一細講了。
有興趣了解Pandas更多細節的讀者,歡迎參考旗標出版的《Python 資料分析必備套件!Pandas 資料清理、重塑、過濾、視覺化》。本書將於11/26正式上市,目前正新書79折促銷中。本書包含114招Pandas的常用技巧,保證讀者學好學滿!最後,附上本文中的程式範例,讀者可以動手試試看。