簡單 Python Pandas 教學:資料科學的入門課
這章我們要來看看什麼是 Pandas,這裡的 Pandas 不是熊貓,是一個非常廣泛應用的資料處理工具!
這個工具被高度整合進 Python 的工具生態鏈中,因此非常常會在深度學習的專案中看到這個工具的出現。對於資料的前處理以及後續的分析非常快速及方便。
簡介
什麼是 Pandas
當然一開始要來講什麼是 Pandas 啦!
Pandas 是一個強大的開源資料處理和分析工具,專門為 Python 設計。它提供非常容易使用的資料結構和功能,讓使用結構化資料的工作變得更加快速、簡單而且高效。
Pandas 的核心資料結構有兩個:
- Series
- DataFrame
Series 是一個一維的資料,而 DataFrame 是一種二維的表格資料結構。這兩個資料結構讓我們能夠以直觀且有助於資料分析的方式儲存和處理資料。
看不懂沒關係!現在看個有印象就好,接下來我們會更近一步講解!
為什麼要用 Pandas
Pandas 在資料科學和分析中被非常廣泛的使用,因為它在處理資料方面非常高效。除了資料的前處理,他還提供分析、視覺化等等後續應用。
另外,Pandas 能夠與其他 Python 的工具庫,比如說 NumPy、Matplotlib 和 Scikit-learn 等等完美整合,這些都是在機器學習領域中非常常見的工具,因此也進一步加強了 Pandas 在數據分析和機器學習任務中的功能。
基本功能和能力
Pandas 的一些主要能力包括:
- 讀取資料如 CSV、EXCEL
- 資料清理和準備,比如處理缺失資料、去除重複值
- 強大的索引方法,利用條件訪問特定行、列或部分資料
- 彈性的資料操作,包括對資料應用函數、合併和組合資料
- 內建的時間序列支持,包括日期、時間、時區轉換的操作
- 快速提供資料摘要
- 與 Matplotlib 和 Seaborn 等資料視覺化工具庫無縫接軌,可直接從 Pandas 資料結構創建圖表
下載安裝
下載
在進入教學以前,我們當然要來下載 Pandas 啦!
安裝的步驟非常簡單!只要打開你的終端機並執行這個指令:
pip3 install pandas
這樣就安裝成功啦!
測試
我們可以通過執行以下的程式碼來確認 Pandas 安裝成功,並且 Python 也讀取得到它:
import pandas as pd # 檢查 Pandas 版本 print("Pandas version:", pd.__version__) # 建立簡單的 DataFrame data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]} df = pd.DataFrame(data) # 顯示 DataFrame print("\nSample DataFrame:\n", df)
如果 Pandas 有被安裝成功,我們就可以看到類似這樣的輸出:
Pandas version: 2.2.1 Sample DataFrame: Name Age 0 Alice 25 1 Bob 30 2 Charlie 35
基本資料結構
Series v.s. DataFrame
前面有講到,Pandas 有兩個最基本的資料結構:
- Series
- DataFrame
Series 其實就是表格中的一列,因此它是一維的。
它可以儲存任何類型的數據,包括整數、浮點數、字串等等。
DataFrameDataFrame 則是一個二維的資料結構,基本上就是一個表格。
其中 DataFrame 中的每一列可以是不同的資料類型。DataFrame 非常靈活,能夠進行有效的資料處理和分析。
由於是一個二維的結構,因此代表相較於 Series 而言,DataFrame 能夠存儲和表示更加複雜的資料集,更適合於較複雜的資料結構。
這裡一張圖就可以清楚知道 Series 和 DataFrame 的意義:
創建 Series 與 DataFrame
接下來,讓我們實際看看該如何創建基本的資料結構。
創建 Series我們可以透過這樣簡單的程式碼創建一個 Series:
import pandas as pd # 創建一個Series s = pd.Series([1, 3, 5, 7, 9]) print(s)
執行程式後,我們會看到這樣的輸出:
0 1 1 3 2 5 3 7 4 9 dtype: int64
我們可以看到有兩列,左邊那列是索引,右邊那列則是我們的資料。
創建 DataFrame# 從字典創建 DataFrame data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'], 'Age': [25, 30, 35, 40], 'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']} df = pd.DataFrame(data) print(df)
執行程式碼後,我們可以看到這樣的輸出:
Name Age City 0 Alice 25 New York 1 Bob 30 Los Angeles 2 Charlie 35 Chicago 3 David 40 Houston
資料操作
我們可以對建立的 Series 和 DataFrame 做一些取值或是訪問的操作:
# 取得 Series 中的元素 print(s[2]) print('\n') # 選擇 DataFrame 中的某一列 print(df['Name'])
我們會看到這樣的輸出:
5 0 Alice 1 Bob 2 Charlie 3 David Name: Name, dtype: object
讀取及探索資料
讀取資料
Pandas 提供了各種不同的 API,讓我們可以讀取來自不同格式的文件。
常見的比如說 CSV、Excel,或是專業領域中的 Parquet 檔,或是想要直接連接資料庫也是可以的。
讀取 CSV我們可以透過 read_csv()
讀取 CSV 的資料:
import pandas as pd # 從 CSV 文件讀取資料 df_csv = pd.read_csv('data.csv')讀取 Excel
如果想要讀取 Excel 檔,我們可以利用 read_excel()
:
# 從 Excel 文件讀取資料 df_excel = pd.read_excel('data.xlsx')連接資料庫
Pandas 也支持資料庫的連接,以下是一個簡單的 SQLite 範例:
import sqlite3 # 連接資料庫 conn = sqlite3.connect('database.db') # 從 SQL 讀取資料 query = 'SELECT * FROM table_name' df_sql = pd.read_sql(query, conn)
探索資料
有了資料後,我們很常會想要知道這個資料的大致訊息。比如說,資料的概覽、總共有幾筆、資料型態等等。
Pandas 也為我們提供了非常簡單的方式得知這些訊息。
我們這裡提供一個簡單的 data.csv
檔:
Name,Age,Gender,City John,25,Male,New York Emily,30,Female,San Francisco Michael,35,Male,Chicago Sophia,28,Female,Los Angeles Daniel,40,Male,Miami Simon,18,Male,California Arthur,19,Male,Texas Bob,45,Male,Florida Sharon,27,Female,Houston Lily,37,Female,Virginia
透過 Pandas 讀取之後,我們可以利用下面的方式取得一些有用的資訊:
# 顯示 DataFrame 的前幾行 print(df_csv.head()) # 檢查列名 print(df_csv.columns) # 檢查資料型態 print(df_csv.dtypes) # 獲取基本統計資訊 print(df_csv.describe())
可以得到這樣的輸出:
Name Age Gender City 0 John 25 Male New York 1 Emily 30 Female San Francisco 2 Michael 35 Male Chicago 3 Sophia 28 Female Los Angeles 4 Daniel 40 Male Miami Index(['Name', 'Age', 'Gender', 'City'], dtype='object') Name object Age int64 Gender object City object dtype: object Age count 10.00000 mean 30.40000 std 8.82169 min 18.00000 25% 25.50000 50% 29.00000 75% 36.50000 max 45.00000
索引和選擇數據
選擇行和列
從資料中提取特定的行或列對於資料的分析和操作非常重要!
我們可以使用列名來選擇特定列,使用索引標籤或位置來選擇行。
比如說:
import pandas as pd # 創建一個範例 DataFrame data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]} df = pd.DataFrame(data) print("原資料:") print(df) # 選擇列 "A" 和 "B" selected_columns = df[['A', 'B']] print("\n選擇資料:") print(selected_columns)
執行後我們就會看到這樣的輸出:
原資料: A B C 0 1 4 7 1 2 5 8 2 3 6 9 選擇資料: A B 0 1 4 1 2 5 2 3 6
條件篩選
條件篩選讓我們可以根據指定的條件進行篩選。這個功能非常非常重要也非常常用!
我們可以使用布林表達式創建一個遮罩,然後將這些遮罩用在篩選資料集上。
比如說以下是選擇欄位「A」中值大於 1 的行:
# 根據條件篩選行 filtered_rows = df[df['A'] > 1] print(filtered_rows)
這麼一來我們就可以將有小於 1 的值的行都去掉:
A B C 1 2 5 8 2 3 6 9
索引方法
Pandas 中提供了兩種方法讓我們可以對資料及進行索引:
loc()
:針對標籤進行索引,這讓我們可以使用索引或列名來取得元素。iloc()
:針對整數位置進行索引,這讓我們可以使用整數位置來取得元素。
# 使用 loc 選擇特定行和列 selected_data_loc = df.loc[1:2, ['A', 'C']] print(selected_data_loc)iloc
# 使用 iloc 選擇特定行和列 selected_data_iloc = df.iloc[1:3, [0, 2]] print(selected_data_iloc)
這兩個方法都會輸出同樣的結果:
A C 1 2 8 2 3 9
因此在使用時單單看你喜歡使用哪個囉~
兩個方法都是可行的!
前處理
讀取資料後,我們常常會做一些資料的前處理,來讓資料達到我們想要的樣子。
這些前處理包括,去除或填補遺失的資料、移除重複的值、資料類型轉換等等。
我們來看看幾個例子:
移除重複值
從資料中移除重複值是清理資料的重要步驟,可以確保後續資料分析的準確性和可靠性。
在 Pandas 中,我們可以使用 drop_duplicates()
根據特定列或所有列來消除資料中的重複行。
比如說:
import pandas as pd # 帶有重複行的範例 DataFrame data = {'Name': ['John', 'Jane', 'John', 'Alice', 'Bob', 'Bob'], 'Age': [25, 30, 25, 35, 40, 40]} df = pd.DataFrame(data) # 基於所有列移除重複值 df_cleaned = df.drop_duplicates() print('移除前:') print(df) print('\n移除後:') print(df_cleaned)
執行結果就會是:
移除前: Name Age 0 John 25 1 Jane 30 2 John 25 3 Alice 35 4 Bob 40 5 Bob 40 移除後: Name Age 0 John 25 1 Jane 30 3 Alice 35 4 Bob 40
處理遺失值
有時候我們的資料會有部分遺失,因此檢查以及處理缺失的部分非常重要。
Pandas 提供了很多方式來處理資料的遺失,比如說 fill_na()
、 drop_na()
等等。
import pandas as pd import numpy as np # 帶有遺失值的範例 DataFrame data = {'Name': ['John', 'Jane', np.nan, 'Alice', 'Bob'], 'Age': [25, np.nan, 30, 35, np.nan]} df = pd.DataFrame(data) # 檢查遺失值 print('檢查是否遺失:') print(df.isnull()) # 使用特定值填充遺失值 df_filled = df.fillna(18) print('\n填補前:') print(df) print('\n填補後:') print(df_filled)
結果就會是:
檢查是否遺失: Name Age 0 False False 1 False True 2 True False 3 False False 4 False True 填補前: Name Age 0 John 25.0 1 Jane NaN 2 NaN 30.0 3 Alice 35.0 4 Bob NaN 填補後: Name Age 0 John 25.0 1 Jane 18.0 2 18 30.0 3 Alice 35.0 4 Bob 18.0
數據類型轉換
有時候我們會想將讀取到的資料轉換到特定形態,比如說將字串轉為數字。
在 Pandas 中我們可以利用 astype()
做到這件事。
import pandas as pd # 帶有混合資料類型的範例 DataFrame data = {'Name': ['John', 'Jane', 'Alice', 'Bob'], 'Age': ['25', '30', '35', '40']} df = pd.DataFrame(data) print('轉換前:') print(df.dtypes) # 將 Age 從字串轉換為整數 df['Age'] = df['Age'].astype(int) print('\n轉換後:') print(df.dtypes)
我們可以看到資料型態確實被轉換了:
轉換前: Name object Age object dtype: object 轉換後: Name object Age int64 dtype: object
資料操作
分組聚合
在資料分析中,我們很常需要將將資料分組並聚合成新的組,然後對這些組進行計算或操作。
例如,假設我們有一個銷售資料集,其中包含「Date」、「Product」、「Quantity Sold」和「Revenue」欄位。
我們可以使用 Pandas 中的 groupby()
按「Product」欄位對資料進行分組,然後利用 mean()
或 sum()
等聚合函數,計算每個產品的總銷售數量或平均收入。
import pandas as pd # 範例資料 data = { 'Date': ['2022-01-01', '2022-01-01', '2022-01-02', '2022-01-02'], 'Product': ['A', 'B', 'A', 'B'], 'Quantity Sold': [100, 150, 120, 200], 'Revenue': [5000, 7500, 6000, 10000] } df = pd.DataFrame(data) print(df) # 按產品對資料進行分組,然後計算每個產品組的總銷售數量和收入 grouped_data = df.groupby('Product').agg({'Quantity Sold': 'sum', 'Revenue': 'sum'}) print('\n分組資料:') print(grouped_data)
我們可以清楚看到每個產品的銷售數量和收入:
Date Product Quantity Sold Revenue 0 2022-01-01 A 100 5000 1 2022-01-01 B 150 7500 2 2022-01-02 A 120 6000 3 2022-01-02 B 200 10000 分組資料: Quantity Sold Revenue Product A 220 11000 B 350 17500
應用函式
在 Pandas 中,我們也可以對資料使用函數,這允許靈活的資料轉換和計算。
比如說,假設我們想應用一個函數來計算利潤率。我們可以定義一個函數,並使用 apply()
並應用到資料集。
# 計算利潤率的函式 def calculate_profit_margin(row): return (row['Revenue'] - row['Cost']) / row['Revenue'] * 100 # 將 Cost 欄位加入資料集 df['Cost'] = [4000, 6000, 4500, 8000] # 計算利潤率 df['Profit Margin (%)'] = df.apply(calculate_profit_margin, axis=1)
在上面的程式碼中,我們新增了「Cost」和「Profit Margin (%)」欄位,並使用自定義的函式 calculate_profit_margin()
來計算每一筆資料的利潤率。
新的資料集就會長這樣:
Date Product Quantity Sold Revenue Cost Profit Margin (%) 0 2022-01-01 A 100 5000 4000 20.0 1 2022-01-01 B 150 7500 6000 20.0 2 2022-01-02 A 120 6000 4500 25.0 3 2022-01-02 B 200 10000 8000 20.0
新增、刪除和重新命名欄位
Pandas 讓我們可以很方便的新增或刪除現有欄位,並根據需要重新命名欄位。
比如說,如果我們想要添加一個「Profit」欄位,並在之後刪除「Cost」欄位,並將「Quantity Sold」欄位重新命名為「Units Sold」,我們可以使用比如 assign()
、drop()
、或 rename()
。
# 加入 Profit 欄位並計算利潤 df = df.assign(Profit=df['Revenue'] - df['Cost']) # 刪除 Cost 欄位 df = df.drop('Cost', axis=1) # 重新命名欄位 df = df.rename(columns={'Quantity Sold': 'Units Sold'})
新的資料集就會長這樣:
Date Product Units Sold Revenue Profit Margin (%) Profit 0 2022-01-01 A 100 5000 20.0 1000 1 2022-01-01 B 150 7500 20.0 1500 2 2022-01-02 A 120 6000 25.0 1500 3 2022-01-02 B 200 10000 20.0 2000
合併不同資料集
我們可以利用 concat()
、merge()
、 和 join()
等各種方法來合併不同資料集。
例如,如果我們有兩個資料集,一個包含銷售資料,另一個包含產品信息。
並且我們想要根據共同的「Product」欄位合併它們,我們可以使用 merge()
方法。
# 範例產品資料 product_data = { 'Product': ['A', 'B'], 'Product Name': ['Apple', 'Banana'], 'Location': ['New York', 'Los Angeles'] } product_df = pd.DataFrame(product_data) # 根據 Product 欄位合併兩個資料集 merged_df = pd.merge(df, product_df, on='Product', how='left')
合併後的資料就會長這樣:
Date Product Units Sold ... Profit Product Name Location 0 2022-01-01 A 100 ... 1000 Apple New York 1 2022-01-01 B 150 ... 1500 Banana Los Angeles 2 2022-01-02 A 120 ... 1500 Apple New York 3 2022-01-02 B 200 ... 2000 Banana Los Angeles
資料輸出
儲存不同格式
當我們整理好資料後,我們可能會想要把最後的資料儲存起來,可能之後可以分享給其他人,或是留著做其他應用。
Pandas 讓我們可以將這些資料儲存成多種不同的格式,包括 CSV、JSON 等等。
比如說:
import pandas as pd # 範例 DataFrame data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35], 'City': ['New York', 'Los Angeles', 'Chicago']} df = pd.DataFrame(data) # 儲存為 CSV df.to_csv('sample_data.csv')
上面的例子利用了 to_csv()
將我們的資料儲存為 sample_data.csv
。
其他類似的方法還有 to_excel()
、to_json()
等等,讓資料儲存非常簡單!
總結
這章我們學了一個在資料科學領域中非常常見的工具:Pandas。
這個工具讓我們可以非常輕鬆的對大量的資料進行系統性的處理以及分析,因此也常常被用在深度學習的領域中。
那這章就到這裡啦~如果喜歡的話歡迎分享喔!
感謝大大分享,不知道之後會不會有更多資料分析實作分享?
謝謝支持!想看什麼歡迎許願!