pandas指南-2.數據索引,選擇與賦

目錄

索引,選擇與賦值

基於索引來選擇數據

基於標籤來選擇數據

操縱索引

條件選擇

賦值操作


索引,選擇與賦值

選擇要處理的pandas DataFrame或Series的特定值幾乎是你將研究的任何數據操作中的隱式步驟。 因此,對如何切分數據集的充分理解至關重要。

在這個案例裏,我們將查看澳大利亞墨爾本的房價數據。

點擊這裏 下載 數據集

我們將使用read_csv函數將數據讀入DataFrame。 這樣做:

import pandas as pd
melbourne_data = pd.read_csv('melb_data.csv') 
pd.set_option("display.max_rows", 5)

原生的訪問方法

原生Python對象提供了許多索引數據的好方法。 pandas將所有這些都包含在內,這有助於讓它更容易入手。

考慮一下這個DataFrame:

melbourne_data

在Python中,我們可以通過將其作爲屬性訪問來訪問對象的屬性。 例如,book對象可能有title屬性,我們可以通過調用book.title來訪問它。 pandas DataFrame中的列以相同的方式工作。

因此,要訪問房價數據的地址屬性,我們可以使用:

melbourne_data.Address

如果我們在Python中有一個dict對象,我們可以使用索引([])運算符訪問它的值。 同樣,我們可以對pandas DataFrame列執行相同的操作。

melbourne_data['Address']

這是從pandas DataFrame中選擇特定Series的兩種方法。 它們中的任何一個都沒有或多或少比另外一個在語法上有效,但索引operator []確實具有可以處理其中包含保留字符的列名的優點(例如,如果我們有一個country providence列,則由於有空格review.country providence就無法工作了)。

pandas Series看起來不像是一個花哨的字典嗎? 它幾乎是,所以毫不奇怪,要深入到單個特定值,我們只需要再次使用索引運算符[]:

melbourne_data['Address'][0]
'85 Turner St'

基於索引來選擇數據

索引操作符和屬性選擇很好,因爲它們的工作方式與Python生態系統的其他部分一樣。 作爲一個新手,這使他們易於使用。 但是,pandas有自己的訪問器運算符loc和iloc。 對於更高級的操作,這些是你應該使用的操作。

pandas索引在兩種範例之一中起作用。 第一種是基於索引的選擇:根據數據中的數字位置選擇數據。 iloc遵循這種範式。

要選擇此DataFrame中的第一行數據,我們可能會使用以下內容:

melbourne_data.iloc[0]

loc和iloc都是行優先,列其次。 這與我們在原生Python中所做的相反,原生Python是列優先,行其次。

這意味着檢索行更容易,並且獲取檢索列的難度稍大。 要使用iloc獲取某列時候,我們可以執行以下操作:

melbourne_data.iloc[:, 0]

:運算符,也來自原生Python,意思是“所有的”。 但是,當與其他選擇器結合使用時,它可用於指示一系列值。 例如,要選擇第一行,第二行和第三行房屋所在的郊縣列,我們會執行以下操作:

melbourne_data.iloc[:3, 0]

或者,要僅選擇第二行和第三行條目,我們會這樣做:

melbourne_data.iloc[1:3, 0]
也可以傳遞一個列表:
melbourne_data.iloc[[0, 1, 2], 0]
最後,負數也可用於選擇。 這將從值的結尾開始向前計數。 例如,這裏是數據集的最後五個元素。
melbourne_data.iloc[-5:]

基於標籤來選擇數據

屬性選擇的第二個範例是loc運算符後面的範例:基於標籤的選擇。 在這個範例中,重要的是數據索引值,而不是它的位置。

例如,要獲得房價數據中的第一個條目,我們現在將執行以下操作:

melbourne_data.loc[0, 'Suburb']
'Abbotsford'

iloc在概念上比loc更簡單,因爲它忽略了數據集的索引。 當我們使用iloc時,我們將數據集視爲一個大矩陣(a list of lists),我們必須按位置索引。 相比之下,loc使用索引中的信息來完成其工作。 由於你的數據集通常具有有意義的索引,因此使用loc通常更容易。 例如,這裏有一個使用loc更容易的操作:

melbourne_data.loc[:, ['Suburb', 'Address', 'Price']]
在loc和iloc之間選擇或轉換時,有一個值得記住的“問題”,即兩種方法使用略有不同的索引方案。

iloc使用Python stdlib索引方案,其中包含範圍的第一個元素,排除最後一個元素。因此0:10將選擇條目0,...,9。同時,loc包含索引。因此0:10將選擇條目0,...,10。

爲什麼要改變?請記住,loc可以索引任何stdlib類型:例如,字符串。如果我們有一個帶有索引值Apples,...,Potatoes,...的DataFrame,並且我們想要選擇“蘋果和土豆之間的所有按首字母排序的水果”,那麼使用 df.loc ['Apples':'Potatoes']比df.loc ['Apples','Potatoet]更加方便(t在字母表中的s後面)。

當DataFrame索引是簡單的數字列表時,例如,這尤其令人困惑。 0,...,1000。在這種情況下,df.iloc [0:1000]將返回1000個條目,而df.loc [0:1000]將返回1001個條目!要使用loc獲取1000個元素,你需要降低一個並請求df.iloc [0:999]。

操縱索引

基於標籤的選擇從索引中的標籤獲得實力。 關鍵的是,我們使用的索引不是一成不變的。 我們可以以我們認爲合適的任何方式操縱索引。

set_index方法可用於完成工作。 以下是set_index到title字段時發生的情況:

melbourne_data.set_index("Address")
如果你可以爲數據集提供比當前數據集更好的索引,則執行set_index非常有用。

條件選擇

到目前爲止,我們一直使用DataFrame本身的結構屬性索引各種數據。 但是,爲了對數據做有趣的事情,我們經常需要根據條件提出問題。

例如,假設我們特別關注區縣爲Abbotsford的房屋。

我們可以先詢問每個房屋是否爲Abbotsford:

melbourne_data.Suburb == 'Abbotsford'

此操作根據每條記錄的區縣Suburb生成一系列真/假布爾值。 然後可以在loc內部使用此結果來選擇相關數據:

melbourne_data.loc[melbourne_data.Suburb == 'Abbotsford']
這個DataFrame有大約56行。 原來有~13580。 這意味着大約0.4%的房屋來自Abbotsford。

我們也想知道房價高於一定數額的房屋有多少

我們可以使用&符號(&)將兩個問題放在一起:

melbourne_data.loc[(melbourne_data.Suburb == 'Abbotsford') & (melbourne_data.Price >= 1000000)]
pandas附帶了一些預先構建的條件選擇器,其中兩個我們將在這裏重點介紹。

第一個是isin。 isin是允許你選擇值“在”值的列表中的數據。 例如,以下是我們如何使用它來選擇僅來自Abbotsford或Airport West的房屋:

melbourne_data.loc[melbourne_data.Suburb.isin(['Abbotsford', 'Airport West'])]
第二個是isnull(和它的伴侶notnull)。 這些方法可以突出顯示非空(NaN)的值。 例如,要過濾掉數據集中缺少價格標籤的房屋,我們將採取以下措施:
melbourne_data.loc[melbourne_data.Price.notnull()]

賦值操作

另一方面,將數據賦值給DataFrame很容易。 你可以指定一個常量值:

melbourne_data['critic'] = 'everyone'
melbourne_data['critic']
0        everyone
1        everyone
           ...   
13578    everyone
13579    everyone
Name: critic, Length: 13580, dtype: object

或者使用可迭代的值:

melbourne_data['index_backwards'] = range(len(melbourne_data), 0, -1)
melbourne_data['index_backwards']
0        13580
1        13579
         ...  
13578        2
13579        1
Name: index_backwards, Length: 13580, dtype: int64 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章