簡單 Python Pandas 教學:資料科學的入門課

這章我們要來看看什麼是 Pandas,這裡的 Pandas 不是熊貓,是一個非常廣泛應用的資料處理工具!

這個工具被高度整合進 Python 的工具生態鏈中,因此非常常會在深度學習的專案中看到這個工具的出現。對於資料的前處理以及後續的分析非常快速及方便。

簡介

什麼是 Pandas

當然一開始要來講什麼是 Pandas 啦!

Pandas 是一個強大的開源資料處理和分析工具,專門為 Python 設計。它提供非常容易使用的資料結構和功能,讓使用結構化資料的工作變得更加快速、簡單而且高效。

Pandas 的核心資料結構有兩個:

  1. Series
  2. DataFrame

Series 是一個一維的資料,而 DataFrame 是一種二維的表格資料結構。這兩個資料結構讓我們能夠以直觀且有助於資料分析的方式儲存和處理資料。

看不懂沒關係!現在看個有印象就好,接下來我們會更近一步講解!

為什麼要用 Pandas

Pandas 在資料科學和分析中被非常廣泛的使用,因為它在處理資料方面非常高效。除了資料的前處理,他還提供分析、視覺化等等後續應用。

另外,Pandas 能夠與其他 Python 的工具庫,比如說 NumPyMatplotlibScikit-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 有兩個最基本的資料結構:

  1. Series
  2. DataFrame
Series

Series 其實就是表格中的一列,因此它是一維的。

它可以儲存任何類型的數據,包括整數、浮點數、字串等等。

DataFrame

DataFrame 則是一個二維的資料結構,基本上就是一個表格。

其中 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
# 使用 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。

這個工具讓我們可以非常輕鬆的對大量的資料進行系統性的處理以及分析,因此也常常被用在深度學習的領域中。

那這章就到這裡啦~如果喜歡的話歡迎分享喔!