由 Pandas 的 DataFrame 中取得資料
In [2]:
import pandas as pd
student = pd.read_csv('student.csv', index_col = 0)
student
Out[2]:
In [3]:
student['Name']
Out[3]:
在 Pandas 中,每個 column 的 label,也可以視為 DataFrame 的一個屬性,因此你也可以使用下面的語法取得單一欄位的資料。
In [4]:
student.Name #使用屬性的方式取資料
Out[4]:
當然,你也可以放一個 list 在 [] 中,取得單一欄位的資料。
要注意的事,當你使用 [[]] 來取得資料時,回傳的是一個 DataFrame,而不是一個 Series 了。
In [5]:
student[['Name']]
Out[5]:
取得多個欄位就一定要用到兩個 [] 了。底下的程式碼取得名字以及性別。
取得所有學生的名字,以及性別¶
In [6]:
student[['Name', 'sex']] # 要注意標籤的大小寫是有區別的
Out[6]:
取得 row 的資料¶
你可以使用 slice 語法,配合 [] 來取得 row 的資料。也可以使用 loc,或是 iloc 來取得 row 的資料。
底下的程式碼取得索引值 0 到 2 的 rows 的資料。
In [7]:
student[0:3] # 取得索引值 0-2 的資料,注意區間是左閉右開, 3 的部分是沒被包含進去的。
Out[7]:
使用 loc 取 row 的資料¶
loc 是 label based 的資料取法,它可以使用底下幾種方式設定 label 來取得資料:- 使用單一 label,例如 loc['s1234567'].
- 使用多個 labels, 例如 loc[['s1234567', 'e1234567']],請注意,這兒有兩個 []。
- 使用 slice 語法,例如 loc['s1234567':'e1374659'],請注意,這兒只有一個 []。
- 使用 boolean array,這部分會獨立一節出來談。
In [8]:
student.loc['s1234567'] #取得單一個 row 的資料,注意回傳為一個 series
Out[8]:
In [9]:
student.loc[['s1234567', 'e1234567']] ##注意有兩個 [],回傳為一個 DataFrame
Out[9]:
In [10]:
#用 slice 來取得一個區間中的資料。注意這兒的 slice 沒有符合 Python 的習慣。這個區間是左閉,右閉的。
#也就是說,右邊的邊界是有包含的!
student.loc['s1234567':'e1374659']
Out[10]:
既然可以取得 row 的資料,當然也可以設定取某些 column。
例如想取得所有學生的名字及性別,也可以使用底下的語法。
例如想取得所有學生的名字及性別,也可以使用底下的語法。
In [11]:
student.loc[:, ['Name', 'sex']] #第 1 個 : 代表全部都要的意思
Out[11]:
取得某些學生的名字以及性別。
In [12]:
student.loc[['s1234567', 'e1374659'], ['Name', 'sex']]
Out[12]:
使用 iloc 來取得資料¶
iloc 是 index based 取資料的方式。它可以使用底下的方式來取得資料。- 使用單一個整數來取得資料,例如 iloc[5]。
- 使用一串整數來取得資料,例如 iloc[[1,3,5]]。
- 使用 slice 來取得資料,例如 iloc[1:3]
- 使用 boolean array,這部分會獨立一節來說明。
In [13]:
student.iloc[0] #單一整數,取得一個 series
Out[13]:
In [14]:
student.iloc[[0]] #單一整數,取得一個 DataFrame
Out[14]:
In [15]:
student.iloc[[0, 2, 4]] #取得多個 row
Out[15]:
In [16]:
#使用 slice,注意這兒的 slice 就符合 Python slice 的規範了,是左閉右開,右邊是不包含的。
student.iloc[0:3]
Out[16]:
使用 boolean array 來取得資料¶
Boolean array 就是一個串列,其中包含一群 boolean 值。這個 boolean array 可以視為一個 遮罩,可以把 false 的部分遮掉,讓它不秀出來。
這樣講有點抽象,來看個例子。
列出表格中所有性別為 1 的學生的資料!
In [17]:
#先把所有性別為 1 的 row 都列出來
#底下的語法會把 == 對 sex 這個 column 的每個值都做一次運算
sex_1 = student['sex'] == 1
print(sex_1)
In [18]:
#接著使用 sex_1 來濾掉性別不為 1 的學生
student[sex_1]
Out[18]:
在上面的程式碼中,只要 sex_1 中為 false 的 row,都會被濾掉。所以剩下的,就是 sex == 1 的學生了。
程式碼也可以整合成一行來寫,如下所示。
程式碼也可以整合成一行來寫,如下所示。
In [19]:
student[student['sex'] == 1]
Out[19]:
除了 == 之外,其它像是 >、<、>=、<=、!= 也都可以使用。
底下程式碼列出不住在台南的所有學生的資料。
底下程式碼列出不住在台南的所有學生的資料。
In [20]:
student[student['city'] != 'Tainan']
Out[20]:
那如果要多個布林邏輯的運算呢?例如要取得身高在 172.5 以上,但在 182.5 以下的學生有那些。
這個時候就要使用 numpy 的 logical_and 函式了。
這個時候就要使用 numpy 的 logical_and 函式了。
In [21]:
import numpy as np
condition = np.logical_and(student['height']>=172.5, student['height']<=182.5) ## 找出那些 row 符合 >=172.5 且 <= 182.5 的條件
condition
Out[21]:
In [22]:
student[condition]
Out[22]:
numpy 中可以對 numpy array 做邏輯運算的有:
使用 at 及 iat 來取得單一值¶
at 和 loc 一樣,都是 label-based 的取值方式。不同處在於 at 用於取單一值,且其運作速度快於 loc。 iat 和 iloc 一樣,都是 index-based 的取值方式。不同處在於 iat 用於取單一值,且其運作速度快於 iloc。
In [24]:
student.at['e1234567','Name'] # 取得 'e1234567' 這位學生的名字
Out[24]:
In [27]:
print(student.iat[0,0]) #取得 [0, 0] 這個位置的學生的名字
type(student.iat[0,0])
Out[27]:
結語¶
這篇文章中,談到了如何在 series 以及 DataFrame 中取得資料的方式。此外,也談到了如何使用 boolean array 來做為遮罩,用來過濾資料,將 DataFrame 中我們想要抓的資料找出來。
留言
張貼留言