[Python資料科學]pandas基礎介紹-進入資料科學的領域
什麼是pandas?乍聽這個字或許你的第一個直覺反應會是那可愛的熊貓。
不過,這裡我們提到的並不是它。而是Python的程式庫之一,pandas這個名稱,來自panel data的延伸,它可以被用來執行強大的資料分析。
雖然我們長期以來都是使用試算表來當作處理與分析資料的工具。但是試算表有其侷限性,例如大多數的試算表都有列數的限制,對於數量超過這個限制的資料及而言,試算表就無法滿足資料分析的需求了。另外,資料維度的問題也是一個試算表的限制,而Python都可以幫助我們超越這些侷限。
pandas,也有人稱它為Python界的Excel試算表,pandas在某個程度上填補了Python在資料分析及建模上的缺口,它結合NumPy(Numerical Python的簡稱)的特性,以及試算表和關連式資料庫(SQL)的資料操作能力,可以用來對資料進行重構、切割、聚合及選擇子集合等操作。透過pandas套件的使用,你可以比單純使用Python輕鬆的完成資料分析的工作,並可以讓你快速的發現資料中的資訊以及其中蘊藏的意義。
有時候,使用pandas時也可能會用到其他的Python 程式庫。例如與數值與科學運算有關的SciPy以前面提過的NumPy,與統計分析有關的StatsModels,與機器學習有關的 scikit-learn,與資料視學化有關的 matplotlib 及 seaborn 等等。嚴格來說,pandas不算是資料科學的工具。精確的來說,pandas是資料科學分析工具前階段的工具。你可以藉由它敲開資料科學領域的大門。
啟動並運行 Pandas
當使用Anaconda 3 的版本時,在預設的狀況下會安裝Python、IPython及Jupyter記事本、Pandas。如果沒有安裝Anaconda的話,就需要透過pip來安裝pandas套件。
$ pip install pandas
Jupyter notebook 是一個以網頁為介面的記事本,它起源於IPython專案。在Jupyter notebook裡面可以使用markdown語法撰寫內容,讓你可以建立包含標題、註解及程式碼的豐富的文件。使用它的另一個好處是,你可以在Jupyter notebook裡面對程式碼進行反覆的測試以及除錯,這個功能對於資料驗證與程式撰寫來說很方便。Jupyter notebook 的主頁在個人的本機端http://localhost:8888/tree 點擊一個.ipynb 連結會開啟一個記事本頁面。
啟動之後,就可以在一格格的編輯區塊(cell)中輸入程式碼進行程式的執行。每一行程式執行後,會把結果顯示在編輯區塊(cell)的下方。
匯入pandas套件
安裝完畢後,使用前我們一樣要先匯入pandas套件:
import pandas as pd
pd是個簡稱,以便於之後我們使用時可以不用每次呼叫時都要打上pandas,只要打pd兩個字就好了。上方的敘述可以翻譯為「匯入Pandas 並且宣告在後續的程式碼以pd來表示」。
在pandas裡面,最重要的兩個基本資料結構就屬Series與DataFrame了。要暸解pandas,一定不可以不知道這兩個的概念。
Series,是一個一維標籤陣列物件。DataFrame則是一個以表格、欄位為主的資料結構,有行與列標籤。接下來我們要簡單介紹這兩個概念。
Pandas Series序列
序列(Series)是一個像是一維陣列資料所組成的物件。我們可以利用python的串列(list)建立一個序列(Series):
s = pd.Series([1, 2, 3, 4])
輸出結果為兩行。第一行為索引,第二行為Series資料。輸出的每一個row由index標籤(label)及其對應的值所組成。如果在建立Series資料的時候沒有指定index的話,pandas會自動產生從0開始的整數索引標籤。
我們可以透過index與values屬性,分別取得Series的index陣列與值。
s.index
Series 的 index陣列顯示:這個Series是從0開始到4結束,每個資料間隔為1。就像前面說的一樣,這是因為我們一開始並沒有特別為Series指定index,所以index會預設為從0開始的數字。
s.values
值的型態為陣列,跟Numpy的型態相似。Numpy也是一個資料分析上常常使用到的套件。一般來說,我們常常會同時載入pandas與Numpy套件。
除了可以用串列建立Series外,你也可以透過字典的方式建立Series。
例如:我們有一個台北市郵遞區號的字典zip_codes。
zip_codes ={
"100":"中正區","103":"大同區","104":"中山區","105":"松山區","106":"大安區","108":"萬華區","110":"信義區","111":"士林區","112":"北投區","114":"內湖區","115":"南港區","116":"文山區
"}
可以透過下面程式碼建立Series。
pd.Series(zip_codes)
結果產生的Series資料是以zip_codes字典的Key為index的序列:
index有一個很有用的功能,就是當Series序列在搭配運算時,運算可以自動以index對齊。
index物件是不可以變得(immutable),所以使用者不可以變更它的值。
透過[]運算子取值
s[2]
我們可以透過[]運算子及傳入欲存取值得index標籤來存取Series物件的值。例如上面的s[2],我們會獲得3這個值。
s[[0, 1]]
我們也可以一次抓兩個以上的值。
Pandas DataFrame資料框
pandas的基本結構是DataFrame,DataFrame是一個二維的資料結構,有行有列,有點像excel試算表中的儲存表格。每個欄位可以是不同的資料型態,例如數字、字串、布林等。你也可以把DataFrame想像成是裝了很多Series物件的字典,而且每個Series物件使用相同的index。
建立DataFrame
建立DataFrame的方法有很多種。你可以用串列list建立,也可以用字典dict建立,或者是使用前面提到的Numpy來建立。
taiwan ={'city':['台北市','新北市','桃園市','台中市','台南市','高雄市'],
'pop':[2631083, 4024539, 2255753, 2816741, 1878845, 2773401],
'area':[271.7997, 2052.5667, 1220.9540, 2214.8968, 2191.6531, 2951.8524],}
例如透過上面的字典taiwan,我們可以建立一個DataFrame。
載入資料
DataFrame在更多的使用情境上,常常是先讀取外部的檔案後,再透過pandas進行資料的分析處理。pandas提供了簡單的語法讓我們可以快速的載入資料。包括csv、excel、sql、json、 html等,甚至於可以透過剪貼簿讀取資料:
如上表,如果你想要載入excel檔案,可以這樣寫:
df = pd.read_excel('檔案名稱')
又如果是csv的話,可以這樣寫:
df = pd.read_csv('檔案名稱')
操作DataFrame
# head()
如果資料太長,我們可以使用head()方法來選取資料開頭前幾個row。預設是五個row。如果你覺得五個row太長,可以試著輸入數字,例如head(3)就是顯示三行的意思。
# 調整欄位順序
如果將欄位以序列方法指定的話,DataFrame就會按照指定的順序排好。要達到這個效果,可以使用columns來指定欄位的順序。如下,我們把pop調整到第一欄。
# 取回資料
DataFrame可以用類似dict的方法來取回資料。取回資料的資料型態是Series。例如,我們把剛剛的DataFrame指定為bigsix變數,並且利用字典的方式呼叫city(bigsix[‘city’]),取回的資料為一組city的Series。
也可以透過loc屬性取回資料。透過loc屬性取資料時,需要指定位置或名稱。例如我們利用loc取出第二列的資料(bigsix.loc[2])。
除了使用loc屬性外,也可以使用iloc取回資料。上面的bigsix.loc[2]我們可以改成bigsix.iloc[2]。
上面兩個例子都是2,實在是看不出差異。實際上loc可以針對標籤取值,iloc則是針對欄位位置的整數值來取值。
# 儲存資料
pandas讓我們可以快速的透過下面語法儲存資料。
pandas是個很出色的套件,它提供了許多便捷的工具來幫助我們完成資料的轉換、處理與分析等等繁瑣的工作,相當程度的擴展了Python的功能。之後我們會針對DataFrame的應用,再進一步的進行說明。如果你用對地方就能充分發揮它的特色,讓你如虎添翼。