文章目錄
本單元測驗:
本系列文章希望能讓有興趣學習資料科學 (Data Science) 及 Python 程式語言的人,透過淺顯易懂及全新不同的方式,由淺入深獲得相關知識。除了其他如 Python for Beginners 或 NumPy、Matplotlib 等初體驗文章外,這一篇同樣帶領大家在進入資訊科學領域前,充分認識如何利用 Pandas 函式庫的強大功能,在 Python 中進行資料操作和分析,以及理解相關的基礎操作。
1. Pandas 簡介
Pandas 是 Python 程式語言中最受歡迎的開源函式庫(Library),它主要是一個用於處理資料集(Dataset)的 Python 函式庫,具有分析、清理、探索和操作資料的功能,被廣泛用於資料科學、資料分析和機器學習應用程式,是資料科學家進行資料操作和分析時最喜歡的工具之一,僅次於用在資料視覺化的 Matplotlib 及 NumPy (建立 Pandas 的 Python 的科學計算基礎函式庫) 。
Pandas 建構在 NumPy 這個流行套件上,而 NumPy 套件在 Python 中主要是提供科學計算並支援多維數組。快速、靈活且富有表現力的 Pandas 資料結構旨在使現實世界的資料分析變得更加容易。Pandas 與其他流行的 Python 資料科學套件(通常稱為 PyData 生態系統)配合的很好,包括:
本文針對具有 Python 基礎知識但沒有 Pandas 經驗的初學者,來幫助大家快速入門上手並且掌握資料操作和探索性資料分析的應用。同時為方便讀者練習,範例中所使用的檔案如下:
2. Pandas 安裝
Pandas 可以利用 CONDA 或 PIP 等套件包管理器來安裝(可參考 Anaconda 3 介紹及安裝教學)。
- CONDA
如果使用 conda,最好的實作方式是使用虛擬環境,而不是安裝在基礎環境中:
conda create -n MyEnv
conda activate MyEnv
實際安裝的指令:
conda install pandas
- PIP
Pandas 也可以使用 pip 安裝,你可以執行下面命令來安裝 Pandas:
pip install pandas
如果是要在 Google Colab 或 Jupyter Notebook 使用 pip 來安裝,要記得在 pip 指令前面要加上 !,參考如下:
!pip install pandas
在使用 pip 時,建議一樣使用虛擬環境。相關虛擬環境的詳細指南及教學可參考下面文章。
安裝後,我們也可以檢查 Pandas 版本。其版本字串儲存在version 屬性中。
import pandas as pd
print(pd.__version__)
開始使用 Pandas 時,先使用 import 來載入 pandas 套件並開始使用它。
import pandas as pd
廣大的社群同意 pandas 的別名是 pd。因此將 pandas 載入且別名設定為 pd 是所有 pandas 文件的標準做法。
3. Pandas 資料結構
Pandas 中有兩個主要資料結構,分別是 Series 和 DataFrame。
- Series:一維資料結構。Series 本質上是一行(column),用於儲存和操作值的序列(sequence)。Pandas Series 有點像列表(List),但更聰明。
- DataFrame:二維資料結構。DataFrame 是由 Series 集合組成的多維表格,用於在 Python 中儲存和操作一些表格狀(table-like)資料(具有列和行的資料)。
我們可以將 Pandas DataFrame 視為可程式化的試算表(spreadsheet)。
Pandas DataFrame 中的一行(column)其實就是一個 Pandas Series。
這些結構很靈活,這也意味著它們可以保存不同類型的資料(例如整數、字串、浮點數),並且可以處理金融、統計、社會科學和許多工程領域的絕大多數典型用例。
我們如何得到上圖的資料格式及型態。我們可以試著寫一小段 code (如下圖),並且使用 type() 來查看資料型態。
# 查看 Country 欄位
type(df.Country)
# 查看 df 表格
type(df)
3.1 Series
Pandas Series 就像資料表中的一行(column),它是一個可以保存任何形態資料的一維陣列。我們試著在串列(List)中建立一個簡單的 Series。
範例 1:建立一個簡單的 Series
如果未指定任何其他內容,則這些值將標有其索引號。第一個值的索引會是 0,第二個值的索引為 1,依此類推(如下圖)。
此標籤可用於存取指定值,可參考下面範例。
範例 2:利用索引存取指定值
我們也可以透過 index 參數,讓使用者可以命名自己的標籤(Labels)名稱。
範例 3:透過 index 參數自訂標籤(Labels)
新標籤將成為新的索引(如下圖)。
建立標籤後,您也可以透過引用新標籤來存取項目。
範例 4:利用新標籤存取指定值
3.2 DataFrame
Pandas DataFrame 是一種二維資料結構,就像是一個二維的數列(array),或是具有列(rows)和行(columns)的表格(table)。
範例 5:建立資料並將其載入到 DataFrame 物件中
DataFrame 結構如下圖。
從上面結果可以看出,DataFrame就像一個有列和行的表格。Pandas可以使用 loc 屬性傳回一個或多個指定列,如下面範例。
範例 6:定位列 (Locate Row) 使用 – 利用列索引
範例 7:定位列 (Locate Row) 使用 – 利用索引列表(List)
我們一樣也可以透過 index 參數,在 DataFrame 中命名自己的索引。
範例 8:命名索引 (Named Indexes)
並且使用屬性中的命名索引 loc 傳回指定的列(後面會詳細介紹 loc 及 iloc 的用法)。
範例 9:尋找命名索引
4. 尋求協助(Asking For Help)
我們也可以利用 help() 來查看一些 class 內容或屬性用法。
範例 10:查看 Series 內容
範例 11:查看 loc 用法
5. 輸入與輸出 (I/O)
Pandas 可以利用 read_* 來讀取許多不同格式的資料檔案後,轉成 Pandas 的 DataFrame 進行處理,並且可以利用 to_* 將DataFrame 的內容輸出成不同格式的資料檔案做輸出。
讓我們來看看幾個範例。
5.1 讀取 CSV 文件
- 儲存大資料集最簡單的方法就是是使用 CSV 檔案(利用逗號分隔的檔案)。
- CSV 檔案包含純文本,是一種眾所周知的格式。
- 在下面範例中,我們將使用名為 taylor_songs.csv 的 CSV 檔案 (原始檔案可參考 Kaggle 資料集,此檔為簡化版)。
範例 12:讀取 CSV 文件檔案
上面範例會將 CSV 文件載入到 DataFrame 中。如果一個包含很多列的大型 DataFrame,Pandas 將只傳回前 5 列和最後 5 列。
我們也可以使用 to_string() 列印整個 DataFrame 內容,如下面範例。
範例 13:利用 to_string() 顯示文件完整內容
5.2 寫入 CSV 文件
範例 14:寫入 CSV 文件檔案
你將會產生一個 taylor_songs_list.csv 的新檔案。如果將 index 設為 False ,我們將可以不顯示 index 所以這一行 (0、1、2…..)。
範例 15:寫入 CSV 文件,並且不顯示 index 索引
5.3 寫入 Excel 文件
我們試著寫入到不同的文件檔案,並且調整其屬性值。
範例 16:讀取 CSV 文件,寫入 Excel 文件
我們將讀進的 CSV 文件載入到 DataFrame 中,並且輸出至 Excel (使用 to_excel ),同時調整其工作表名稱(sheet_name)。
5.4 讀取 JSON 文件
我們試著將下面這個 JSON 檔 (data.json) 載入到 DataFrame 中。
範例 17:讀取 JSON 文件
範例 18:將 Python 字典載入到 DataFrame 中
如果 JSON 程式碼不在檔案中,而是在 Python 的字典中,那我們可以直接將其載入到 DataFrame 中。
6. 分析 DataFrame
將表格資料作為 DataFrame 讀取後,我們會需要大致了解一下資料,同時可以查看資料集少量樣本,或以摘要統計的形式查看資料摘要。下方範例將使用 states.csv 做為介紹。
6.1 使用 .head() 及 .tail() 查看資料
使用 .head() 或 .tail() 方法來查看 DataFrame 的前幾列或最後幾列(預設值為 5)。
範例 19:使用 .head() 查看資料
範例 20:使用參數 n 來指定列數
.head() 及 .tail() 都可以透過參數 n 來指定列數。
6.2 使用 .describe() 理解資料
.describe() 方法可以列印所有數字欄位(column)有關的統計摘要訊息,例如數字欄位的計數、平均值、標準差、範圍和四分位數。
範例 21:使用 .describe() 查看統計摘要
範例 22: 修改四分位數
您也可以使用參數 percentiles 來修改四分位數。例如,我們想查看 DataFrame df 中數字欄位的 30%、50% 和 70% 百分位數。
範例 23: 使用 .T 來轉置統計資料
我們也可以使用 .T 來轉置匯總的統計資料
6.3 使用 .info() 理解資料
如果想要查看 DataFrame 的技術摘要,可以使用 info() 方法。它可以讓我們更詳細地解釋輸出。
範例 24: 使用 .info() 來查看資料技術摘要
6.4 使用 .shape 理解資料
DataFrame 的列數(rows)和行數(columns)可以使用 DataFrame 的 .shape 屬性來識別。
範例 25: 使用 .shape 取得維度列數及行數
範例 26: 使用 .shape 取得列數或行數
它會傳回一個使用元組(tuple)表示的(列, 行)也就是(row, column),並且可以利用索引來獲取列或行作輸出。
6.5 取得所有行(columns)及行名(column name)
呼叫 DataFrame 物件的 .columns 屬性,然後用 Index 物件的形式傳回行(column)名稱。這裡附帶提醒一下,pandas 的 index 是列或行的位址(address)/標籤(label) 。
範例 27:取得行(column)名稱
我們也可以使用 list() 函式將其轉換為串列(list)。
6.6 檢查 pandas 中的缺失值 .isnull()
我們可以在 pandas 中使用 .isnull() 來檢查是否有任何缺失值。由於本範例(states.csv)的 DataFrame 中沒有任何缺失值,讓我們介紹一些讓事情變得有趣的方法。
我們使用 .copy() 方法來複製原始的 DataFrame。這樣做是為了確保副本的任何變更不會影響原始 DataFrame 中的資料。同時使用 .loc 將 state 欄位中第 1 列到第 3 列設定為 NaN 值,讓這些值表示為缺失值,做為這個小節範例使用。
範例 28:複製資料並設定指定欄位為 NaN 值
範例 29:使用 .isnull() 檢查缺失值
您可以使用 .isnull() 方法來檢查 DataFrame 中的每個元素是否遺失。本範例只顯示前 5 列狀況。
範例 30:使用 .sum() 計算缺失(空值)數量
為了解有多少缺失資料通常更有用,您可以結合使用 .isnull() 和 .sum()來計算每行中的缺失(空值)數量。
您也可以進行雙重求和來取得整個 DataFrame 中的缺失(空值)總數。
7. 選擇 DataFrame 子集合
7.1 使用 [ ] 選擇特定一行
- 使用包含行名稱的方括號來選擇單一一行(column)。輸出會是一個 pandas Series 物件。
- pandas Series 是一個一維數組,包含任何類型的資料,包括整數、浮點數、字串、布林值、python 物件等。
- DataFrame 由許多充當行的 series 所組成。
我們先來複習一下前面所提的觀念。
範例 31:使用 [ ] 來選擇特定一行
7.2 使用 [[ ]] 選擇特定多行
- 若要選擇特定多行(欄位),可以在方括號內提供具有多個行名稱的串列(list)以取得多個行(columns)。
- 這裡,方括號有兩種不同的使用方式。內部方括號定義帶有行名稱的 Python 串列(list),
而外部方括號則表示 DataFrame 的子集,用於從 pandas DataFrame 中選擇資料。
範例 32:使用 [[ ]] 選擇特定多行
以下方為例,內部方括號雖只有一個,但因為有外部方括號,此時也算是 DataFrame 的子集合。
7.3 使用 [ ] 選擇特定一列
我們可以透過傳入具有一個 True 值的布林 series 來獲取單列。在下面的範例中,傳回 index = 1 的第二列。
範例 33:使用 [ ] 選擇特定一列
這裡 .index 傳回 DataFrame 的列標籤,並且跟條件式進行比較後其轉換為布林的一維陣列(array)(如下範例)。
7.4 使用 [ ] 選擇特定多列
同樣,也可以使用 .isin() 方法,而不是 == 運算子傳回更多列,如下面範例。
範例 34:使用 .isin() 傳回多列
這裡 .index.isin(range(2,10)) 方法傳回布林的一維陣列(array)。
7.5 使用 .loc[ ] 和 .iloc[ ] 取得列
- 我們可以使用 .loc[ ] and .iloc[ ] ( “location” 和 “integer location“) 按標籤(label)或條件來取得特定列(row)。
- .loc[ ] 使用標籤來指向列(row)、行(column)或儲存格(cell),
- .iloc[ ] 則使用數字位置。
為了理解兩者的區別,我們建立一個下方的資料表,並調整其 label name。
範例 35:調整 label name
為了理解兩者的區別,我們建立一個下方的資料表,並調整其 label name。
下圖顯示 .loc 是以列名稱(label name) 為主,而 .iloc 則是以列的位置為主(position),參考下圖可以了解其差別性。
下面的範例傳回 pandas Series 而不是 DataFrame。
範例 36:.loc 及 .iloc 使用 – 利用列名稱及列位置
.loc[ ] 中的 April 表示列名稱(label),而 .iloc[ ] 中的 0 則是表示是列位置(position) 。
範例 37:.loc 及 .iloc 使用 – 提供範圍取得多列
您也可以透過在方括號中提供範圍來取得多列。
範例 38:.loc 及 .iloc 使用 – 使用串列 (List)
您也可以使用串列(List)而不是範圍來對 .loc[ ] 和 .iloc[ ] 進行子集合化。
範例 39:.loc 及 .iloc 使用 – 使用特定列及特定行
您也可以隨著列(rows)來選擇特定的行(columns)。這就是 .iloc[ ] 不同之處 .loc[ ] → 它需要行位置(location)而不是行標籤(label)。
範例 40:使用指定運算子 “=“ 更新值
您可以使用指定運算子 “=“ 來更新或修改某些值。
綜合上面範例,我們整理下圖重點提供讀者參考。
本篇文章介紹了 Python 程式語言中蠻受歡迎的開源函式庫(Library) – Pandas,具有分析、清理、探索和操作資料的功能,並被廣泛用於資料科學、資料分析和機器學習應用程式。
從 Pandas 的簡介與安裝(建議可以使用虛擬環境來學習),詳細介紹 Pandas 的兩個重要資料結構(一維的 Series 及二維的 DataFrame),並在此基礎上 step by step 教讀者動手操作輸入與輸出 (I/O)、分析 DataFrame及如何選擇 DataFrame 子集合。後續文章也會在此基礎上,學習更多觀念及有趣的專案。
讀者若想要多了解一些 Python 的基本程式語法,可以參考 Python for Beginners 系列文章,裡面有大量範例及 Quiz 練習。若是想要了解一些 AI 、機器學習及深度學習的基礎概念,可以參考這一本書【從 AI 到 生成式 AI:40 個零程式的實作體驗,培養新世代人工智慧素養】,它將帶領讀者在不會程式、不會數學也OK!的情況下,建立最完整的 AI 入門知識。
如果你喜歡這篇文章歡迎訂閱、分享(請載名出處)與追蹤,並持續關注最新文章。同時 FB 及 IG 也會不定期提供國內外教育與科技新知。