[Python資料科學]pandas基礎介紹-進入資料科學的領域

什麼是pandas?乍聽這個字或許你的第一個直覺反應會是那可愛的熊貓。

Photo by Bruce Hong on Unsplash

不過,這裡我們提到的並不是它。而是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、IPythonJupyter記事本、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調整到第一欄。

pd.DataFrame(taiwan, columns = [‘pop’,’city’,’area’])

# 取回資料

DataFrame可以用類似dict的方法來取回資料。取回資料的資料型態是Series。例如,我們把剛剛的DataFrame指定為bigsix變數,並且利用字典的方式呼叫city(bigsix[‘city’]),取回的資料為一組city的Series。

bigsix[‘city’]

也可以透過loc屬性取回資料。透過loc屬性取資料時,需要指定位置或名稱。例如我們利用loc取出第二列的資料(bigsix.loc[2])。

bigsix.loc[2]

除了使用loc屬性外,也可以使用iloc取回資料。上面的bigsix.loc[2]我們可以改成bigsix.iloc[2]。

上面兩個例子都是2,實在是看不出差異。實際上loc可以針對標籤取值,iloc則是針對欄位位置的整數值來取值。

# 儲存資料

pandas讓我們可以快速的透過下面語法儲存資料。

pandas是個很出色的套件,它提供了許多便捷的工具來幫助我們完成資料的轉換、處理與分析等等繁瑣的工作,相當程度的擴展了Python的功能。之後我們會針對DataFrame的應用,再進一步的進行說明。如果你用對地方就能充分發揮它的特色,讓你如虎添翼。

參考資料:

延伸閱讀:

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。