跳到主要內容

Day 17 Pandas 入門

Day 17 Pandas 入門

引言

NumPy 的陣列很適合做數值運算,但現實世界的資料多半是表格:有欄位名稱、有不同型別、可能缺值、可能來自 CSV 檔或資料庫。Pandas 正是為了處理這種「表格型資料」而生的套件,它的核心資料結構是 Series(一維)與 DataFrame(二維)。可以把它想成「Python 版的 Excel」,但能用程式靈活操作幾十萬、幾百萬列的資料,而且很多操作寫起來比 Excel 函式更直覺,也更容易自動化與重現。

今天會從安裝開始,認識 Series 與 DataFrame 的建立方式,學會用 read_csv() 讀取外部資料,並用 head()、info()、describe() 快速掌握一份陌生資料的輪廓。這些基本功是後續資料清理與分析的起點。建議手上準備一份自己的 CSV(學生資料、銷售紀錄、記帳檔都可以),實際跟著範例操作一次,印象會更深刻。如果沒有現成資料,也可以從政府開放資料平台下載一份小型 CSV,例如停車場、氣象、票房等都很常見。

安裝與匯入

Pandas 的安裝方式與 NumPy 一樣,都是用 pip。目前主流版本是 2.2.x(2024 年初發布),它在字串欄位、缺失值處理與 PyArrow 整合上有不少改進。建議把 numpy 與 pandas 一起裝好,後續資料處理的工具鏈大致就齊了。如果之後要做深度學習,torch 安裝時會順帶安裝 numpy,但 pandas 仍需要另外安裝。如果在 Linux 上遇到 pip 編譯失敗,可以先裝好 python3-dev 與 build-essential,這是某些版本的 pandas 編譯加速程式所需要的。

pip install pandas==2.2.3 numpy

匯入的慣例是 import pandas as pd,與 numpy 一樣用短別名減少打字。之後寫程式會大量用到 pd.xxx(),熟悉之後閱讀別人的程式碼會非常順。在 Jupyter Notebook 裡,也可以用 from pandas import *,但這會把 read_csv、DataFrame 等名稱一口氣匯入,容易和專案內自己定義的東西衝突,正式檔案不建議這樣寫。為了讓資料處理更靈活,Pandas 也常常和 matplotlib、seaborn 一起匯入,分別負責計算與繪圖。

import pandas as pd

print(pd.__version__)  # 輸出:2.2.3

Series:帶標籤的一維陣列

Series 可以想成「有名字的陣列」:每個元素除了值之外還有一個索引標籤。可以從串列、字典、NumPy 陣列建立。預設的索引是 0、1、2…,但也能指定自訂的標籤,例如股票代號或日期。Series 是構成 DataFrame 的基礎,每一欄其實就是一個 Series。如果把 Series 想成 Excel 的一行加上標題,那就是它的角色:除了值還帶有意義清楚的索引。

import pandas as pd

s = pd.Series([85, 73, 92], index=["小明", "小華", "小美"])
print(s)
# 輸出:
# 小明    85
# 小華    73
# 小美    92
# dtype: int64

print(s["小明"])        # 用標籤取值:85
print(s.mean())         # 平均值:83.33...
print(s[s >= 80])      # 布林索引,篩選 >= 80 的學生

Series 內部其實是用 NumPy ndarray 儲存資料,所以所有 NumPy 的運算(加減乘除、統計函式、布林索引)都能直接套用。這也是 Pandas 高效的祕密:漂亮的表格外觀加上 NumPy 的速度。當 Series 的 dtype 是 int 或 float 時,缺失值會以 NaN 表示,這時呼叫 mean() 會自動忽略 NaN,不會讓整個計算失效。如果想用 Series 做更多進階操作,還可以用 s.map() 套函式、s.value_counts() 計算次數分佈。

DataFrame:表格型資料的王者

DataFrame 是 Pandas 的核心,每一欄是一個 Series,所有 Series 共享同一個列索引。建立方式很多,最常見的是從字典或從 CSV 檔案。也可以從 NumPy 二維陣列、串列的串列、甚至是資料庫查詢結果建立,實務上 read_csv() 是最常用的入口。DataFrame 同時提供列索引(row index)與欄索引(column index),這讓我們能用兩種方向走訪資料,與 SQL 的 SELECT 語句很像。

import pandas as pd

data = {
    "姓名": ["小明", "小華", "小美", "小李"],
    "國文": [85, 73, 92, 66],
    "英文": [78, 80, 88, 75],
    "數學": [90, 65, 95, 70],
}
df = pd.DataFrame(data)
print(df)
# 輸出:
#    姓名  國文  英文  數學
# 0  小明  85  78  90
# 1  小華  73  80  65
# 2  小美  92  88  95
# 3  小李  66  75  70

print(df["國文"])           # 取得單欄(回傳 Series)
print(df[["姓名", "數學"]])  # 同時取多欄
print(df.iloc[0])            # 用位置取第一列
print(df.loc[1, "英文"])    # 用標籤取第 2 列的英文分數

「用單括號 [] 取欄,用 [[...]] 取多欄」是新手最常搞混的地方:df["國文"] 是 Series,df[["國文", "英文"]] 是 DataFrame。同時 iloc 用「整數位置」、loc 用「標籤」,兩者的差異在資料處理時要分清楚。如果未來想做複雜的條件篩選,記得優先用 loc 搭配布林索引,能同時指定列與欄的條件。對列的布林索引寫起來也很直覺,例如 df[df["數學"] >= 80] 就能挑出數學 80 分以上的學生。

用 read_csv() 讀取外部資料

實務上多數資料來自 CSV 或 Excel。Pandas 內建 read_csv()、read_excel()、read_json() 等函式,能直接從檔案或網址讀成 DataFrame。讀進來之後欄位名稱、型別、缺失值都會自動推斷。對於熟悉 SQL 的人來說,這個流程就像在執行 SELECT * FROM table,只是結果直接變成 Python 物件。

import pandas as pd

# 讀取 CSV(假設檔案在當前目錄)
df = pd.read_csv("sales.csv", encoding="utf-8")

# 常用參數
df2 = pd.read_csv(
    "sales.csv",
    encoding="utf-8",
    parse_dates=["訂單日期"],   # 把字串解析為日期
    dtype={"顧客ID": str},     # 指定欄位型別,避免被猜成數字
    usecols=["訂單日期", "顧客ID", "金額"],  # 只讀需要的欄位
)

# 寫出 CSV
df2.to_csv("sales_clean.csv", index=False, encoding="utf-8")

read_csv() 的參數非常多,常見的還有 na_values(自訂缺失值字串)、nrows(只讀前 N 列)、skiprows(跳過幾列)。建議第一次讀陌生檔案時先用 nrows=5 看前幾列,確認欄位與分隔字元正確,再正式讀進來。to_csv() 的 index=False 是新手常忘的參數,不加會把索引也寫進檔案。如果是處理 Excel 檔,read_excel() 用法幾乎一樣,只是多了一個 sheet_name 參數。對於大型 CSV,也可以搭配 chunksize 參數分塊讀取,避免一次塞爆記憶體。

快速掌握一份資料的輪廓

拿到新資料時,第一件事是「看懂它」。Pandas 提供幾個函式讓你幾秒鐘掌握資料形狀、欄位型別與統計摘要。這些函式通常會在資料探索(EDA)階段反覆出現,寫成專屬的探索函式也很常見。順手把 head()、info()、describe() 的輸出整理成 markdown 表格,也是資料分析報告的基本動作。

import pandas as pd

df = pd.read_csv("sales.csv", encoding="utf-8")

print(df.head())        # 前 5 列
print(df.tail(3))       # 最後 3 列
print(df.shape)         # (列數, 欄數)
print(df.columns)       # 所有欄位名稱
print(df.info())        # 欄位、型別、缺失值數量
print(df.describe())    # 數值欄位的統計摘要
print(df["金額"].mean())  # 單欄平均
print(df["金額"].sum())   # 單欄加總

describe() 預設只處理數值欄位,如果想看字串欄位的摘要,可以加上 include="all" 或 include="object"。info() 會顯示每欄的「非缺失值數量」與 dtype,是判斷資料是否需要清理的重要依據。head() 與 sample() 則是在做資料檢查時的好工具,能在不印出整份資料的情況下隨機抽幾列。sample(n=5, random_state=42) 可以固定亂數種子,讓抽樣結果可重現,對協作除錯很有幫助。

結語

今天把 Pandas 的入門走了一遍:Series 與 DataFrame 是核心,建立方式多元,read_csv() 讓我們從檔案輕鬆讀進真實資料,head()、info()、describe() 則用最少程式碼摸清資料的輪廓。掌握這些工具之後,面對陌生資料就能快速建立直觀,不再被一堆 Excel 欄位嚇到。建議實際打開一份自己工作上的 CSV 練習,從讀取、檢查到最後輸出,會對工具鏈有完整感受。如果已經熟悉 SQL,會發現 Pandas 的思維和 SQL 很接近,但寫起來更靈活也更容易重複執行。

明天,我們會用 Pandas 做資料清理:處理缺失值、篩選與排序、重複資料,以及用 groupby() 做分組聚合,這些都是資料分析實戰中最常見的工作,也是後續機器學習前處理的基本功。

留言

這個網誌中的熱門文章

Day 2 變數與資料型別

Day 2 變數與資料型別 引言 寫程式的過程中,變數與資料型別是處理資料的基礎。變數是存放資料的容器,資料型別則決定這筆資料有哪些特性、可以進行哪些操作。學會定義變數、認識各種資料型別,是學好 Python 的關鍵一步。 這篇文章會帶你了解 Python 中變數的觀念、如何定義變數,以及常見的資料型別,包括整數、浮點數、字串、布林值,還有串列、元組、字典與集合等容器型別。我們也會介紹變數的命名規則與撰寫風格建議,以及如何用 type() 檢查資料型別。 什麼是變數?如何在 Python 中定義變數 變數是在程式執行時用來存放資料的名稱。透過定義變數,我們可以給一筆資料一個名字,並在程式的其他地方用這個名字取用該筆資料。在 Python 中,變數不需要事先宣告型別,因為 Python 是動態型別語言,變數的型別由指定給它的值決定。 定義變數的基本語法 在 Python 中定義變數非常簡單,只要用賦值符號 = 把值指定給變數即可。例如: x = 5 # 定義變數 x,並把整數 5 賦值給它 name = "Alice" # 定義變數 name,並把字串 "Alice" 賦值給它 在這裡,x 是一個變數,被賦予整數 5;name 是另一個變數,被賦予字串 "Alice"。 變數的更新與覆寫 變數的值可以修改,也就是說,我們可以在程式的不同地方給同一個變數新的值。例如: x = 10 # x 最初被賦予 10 x = 15 # x 的值現在被更新為 15 這樣就能依照需求,在程式執行過程中靈活調整變數的值。 Python 的動態型別系統 Python 和某些靜態型別語言不同,定義變數時不需要宣告型別。賦值時,Python 會根據值自動判斷變數的型別。例如: x = 5 # x 是整數 x = 3.14 # x 變成浮點數 x = "Hi" # x 變成字串 同一個變數在程式執行過程中可以存放不同型別的值,這是 Python 的彈性之一。 常見資料型別 在 Python 中,資料型別決定我們可以對變數進行哪些操作...

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門 隨著人工智慧(AI)與深度學習(Deep Learning)快速發展,越來越多人對這些技術產生興趣。不論你是想踏入 AI 領域的初學者,還是已經有程式基礎的開發者,學好 Python 與深度學習框架(例如 PyTorch),都能為你打開更多可能。 為什麼選擇 Python? Python 已經是資料科學與人工智慧領域的首選語言。它的語法簡潔、容易上手,而且擁有龐大的生態系與大量開源函式庫。無論是資料處理、資料視覺化,還是建立機器學習與深度學習模型,Python 都能勝任。對想進入 AI 或資料科學領域的人來說,它幾乎是必備工具。 PyTorch 是什麼? PyTorch 是由 Meta(原 Facebook)AI 研究團隊開發的開源深度學習框架,以易用、靈活和動態計算圖著稱,是許多 AI 研究人員與開發者的首選。相較於其他框架,PyTorch 的寫法更貼近原生 Python,對初學者相對友善。無論是簡單的實驗,還是複雜的深度學習模型,PyTorch 都能提供強大的支援。 這個系列能帶給你什麼? 這個系列會從 Python 的基礎開始,帶你一步一步學習,最後能自己用 PyTorch 建立深度學習模型。即使你完全沒有寫過程式,也能跟著文章的節奏累積技能,理解 AI 與深度學習的核心觀念。 本系列涵蓋的主題 Python 基礎:從變數、條件判斷到函式與模組。 資料處理工具:用 NumPy 與 Pandas 有效率地操作資料。 資料視覺化:用 Matplotlib 與 Seaborn 把資料畫成圖表。 深度學習的數學基礎:線性代數、微積分與機率。 PyTorch 入門:理解張量、模型建構與 GPU 加速。 基礎深度學習模型:CNN 與 RNN 的實作應用。 深度學習專案實戰:從資料前處理到模型部署的端到端流程。 誰適合這個系列? 程式初學者 :如果你對 AI 充滿好奇,卻還沒寫過程式,系列的第一部分會帶你快速上手 Python,並幫助你理解深度學習的基本觀念。 資料科學愛好者 :如果你已經熟悉一些資料處理方法,進階部分會教你如何用 PyTorch 建構深度學習模型。 開發者與研究人員 :想更深入了...

Day 1 Python 簡介與環境設定

Day 1 Python 簡介與環境設定 引言 在現在的科技環境裡,程式設計已經是一項重要技能。無論你是對資料科學有興趣、想成為開發者,或是想踏入人工智慧(AI)領域,學會寫程式都能明顯提升你的競爭力。在眾多程式語言中,Python 因為語法簡單、功能強大、應用範圍廣泛,成為許多人進入程式世界的第一選擇。這篇文章會帶你認識 Python 的背景與優勢,並一步步教你在不同系統上安裝與設定 Python 開發環境,最後寫出第一支 Python 程式。 為什麼選擇 Python? Python 是一種高階程式語言,由 Guido van Rossum 在 1991 年發布。Python 的設計哲學強調程式碼的可讀性,並用縮排來定義程式區塊,這點和許多使用大括號的語言不同。簡潔的語法讓它成為初學者的理想選擇;就算是經驗豐富的開發者,也能用它完成複雜的專案。 Python 的優勢如下: 簡單易學 :Python 的語法清楚、結構簡潔,初學者很快就能上手。和其他語言相比,學習曲線相對平緩,不需要先弄懂一堆複雜觀念,就能開始寫程式。 應用範圍廣泛 :從資料科學、網頁開發、人工智慧、機器學習、自動化測試到網路爬蟲,Python 都有大量開源函式庫與工具支援,而且在這些領域都扮演關鍵角色。 豐富的函式庫與框架 :Python 的函式庫生態系非常龐大。做資料分析有 NumPy、Pandas;開發網站有 Django、Flask;做深度學習有 TensorFlow、PyTorch。各種需求幾乎都能找到對應的套件,讓開發更有效率。 跨平台支援 :Python 支援 Windows、macOS、Linux 等作業系統,程式通常不需要太多修改就能跨平台執行,讓開發與部署更有彈性。 活躍的社群 :Python 擁有龐大的開發者社群。學習或開發上遇到問題,幾乎都能在社群與論壇(例如 Stack Overflow)找到答案,對初學者來說是很強的後盾,也能減少卡關時的挫折感。 Python 的應用領域 Python 的流行與強大功能,讓許多領域都開始大量使用它。以下是幾個常見的應用方向: 資料科學 :隨著大數據與人工智慧興起,資料科學大量使用 Python。NumPy、Pandas 與 Matplotlib 等工具能處理和分析龐...