資料科學 教學 資料處理 資料清理

學習 Pandas:基本操作與資料清理

學習 Pandas:基本操作與資料清理

課程目標

本課程旨在幫助學員從零開始,掌握 Pandas 的基本操作與資料清理技巧,能夠運用 Pandas 進行資料分析與處理。

課程大綱

1. Pandas 簡介與環境設置

  • 什麼是 Pandas?
  • Pandas 的優勢與應用場景
  • 安裝 Pandas
  • 匯入 Pandas 函式庫
import pandas as pd
import numpy as np  # 通常也會一起匯入 NumPy

2. Pandas 資料結構:Series

  • Series 的概念:一維標籤化陣列
  • 建立 Series:
    • 從 Python 列表建立
# 創建一個簡單的Series
data = [1, 2, 3, 4, 5]
series = pd.Series(data, name='Example Series')
print(series)

3. Pandas 資料結構:DataFrame

  • DataFrame 的概念:二維表格型資料結構
  • 建立 DataFrame:
    • 從字典建立
  • DataFrame 的基本屬性:
    • shape:DataFrame 的形狀(列數、欄數)
    • columns:欄位名稱
    • index:列索引
  • DataFrame 的索引與選擇:
    • 選擇欄位
    • 選擇列
    • 使用 loc 和 iloc 進行選擇
    • 條件篩選
  • DataFrame 的基本操作:
    • 新增欄位
    • 刪除欄位
    • 修改欄位
# 創建一個簡單的DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35],
        'Score': [88, 92, 85]}
df = pd.DataFrame(data)
print(df)

# 選擇欄位
print(df['Name'])

# 選擇列
print(df.iloc[0]) #選擇第一列

# 條件篩選
filtered_df = df[df['Age'] > 30]
print(filtered_df)

4. 資料載入與儲存

  • 讀取 CSV 檔案: pd.read_csv()
  • 儲存 DataFrame 為 CSV 檔案: df.to_csv()
# 讀取 CSV 檔案
# df = pd.read_csv('data.csv') # 假設有名為 data.csv 的檔案
# print(df)

# 儲存 DataFrame 為 CSV 檔案
# df.to_csv('output.csv', index=False) # 不儲存索引

5. 資料清理

  • 處理缺失值:
    • 判斷缺失值: isna()isnull()
    • 填補缺失值: fillna()
    • 刪除缺失值: dropna()
  • 處理重複值:
    • 判斷重複值: duplicated()
    • 刪除重複值: drop_duplicates()
  • 資料類型轉換: astype()
# 創建一個包含NaN的DataFrame
df_nan = pd.DataFrame({'A': [1, 2, np.nan], 'B': [4, np.nan, 6]})
print(df_nan.isna()) # 判斷哪裡是NaN
print(df_nan.fillna(0)) # 將NaN替換為0

# 剔除缺失值
df_dropped = df_nan.dropna()
print(df_dropped)

# 判斷重複值
df = pd.DataFrame({'A': [1, 2, 2, 3], 'B': [4, 5, 5, 6]})
print(df.duplicated()) # 判斷重複值

# 刪除重複值
df_dropped = df.drop_duplicates() # 刪除重複值
print(df_dropped)

6. 資料操作與變換

  • 行的操作
  • 列的操作
  • 資料的聚合與群組運算
  • 資料合併: concatmerge
# 範例資料集
data = {'類別': ['A', 'A', 'B', 'B', 'C', 'C'],
        '數量': [10, 15, 10, 10, 20, 25]}

df = pd.DataFrame(data)

# 依據 '類別' 分組並計算每組的總和
grouped_df = df.groupby('類別').sum()
print(grouped_df)

# 新增一個欄位
df['數量_兩倍'] = df['數量'] * 2
print(df)

# 改變欄位名稱
df.rename(columns={'數量': '產品數量'}, inplace=True)
print(df)

# 合併兩個DataFrame
df1 = pd.DataFrame({'Key': ['A', 'B', 'C'], 'Value': [1, 2, 3]})
df2 = pd.DataFrame({'Key': ['A', 'B', 'D'], 'Value': [4, 5, 6]})
df_merged = pd.merge(df1, df2, on='Key', how='inner')
print("\nMerge 合併後的 DataFrame:\n", df_merged)

7. 資料統計與分析

  • 計算各列的平均值
  • 計算每列的總和
  • 值的排序
  • 描述性統計
  • 相關性分析
  • 計算次數
# 範例資料集
data = {'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10]}
df = pd.DataFrame(data)

# 計算各列的平均值
mean_values = df.mean()
print(mean_values)

# 計算每列的總和
sum_values = df.sum()
print(sum_values)

# 根據列A排序
sorted_df = df.sort_values(by='A', ascending=False)
print(sorted_df)

# 描述性統計
print(df.describe())

# 相關性分析
print(df.corr())

8. 數據正規化

  • 最小-最大正規化(Min-Max Scaling)
# 範例資料集
data = {'Salary': [50000, 60000, 70000], 'Score': [3.5, 4.2, 5.0]}
df = pd.DataFrame(data)

# 最小-最大正規化(Min-Max Scaling)
df['Salary'] = (df['Salary'] - df['Salary'].min()) / (df['Salary'].max() - df['Salary'].min())
df['Score'] = (df['Score'] - df['Score'].min()) / (df['Score'].max() - df['Score'].min())

print(df)

9. 時間序列資料處理 (基礎)

  • 時間序列的建立: pd.date_range()
  • 時間序列的索引與選擇
  • 時間序列的重採樣: resample()
  • 移動平均: rolling()
# 時間序列的建立
dates = pd.date_range('2025-01-01', periods=6, freq='D')
df = pd.DataFrame({'Date': dates, 'Sales': [200, 220, 250, 270, 300, 350]})
df.set_index('Date', inplace=True)
print(df)

# 移動平均
df['Moving Average'] = df['Sales'].rolling(window=3).mean()
print(df)

10. 資料視覺化 (基礎)

  • 使用 Pandas 內建的繪圖功能
  • 繪製線圖、散佈圖、長條圖、直方圖等
import matplotlib.pyplot as plt

# 繪製線圖
df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 2, 9, 10]})
df.plot(x='A', y='B', kind='line')
plt.show()

# 繪製直方圖
df['A'].plot(kind='hist')
plt.show()

11. 向量化字串操作

# 範例
string_series = pd.Series(['apple', 'banana', 'cherry'])
upper_case = string_series.str.upper()
print("\n將字串轉為大寫:\n", upper_case)

12. 高效率 Pandas: eval()query()

# 範例
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df['C'] = pd.eval('df["A"] + df["B"]')
print(df)

df_filtered = df.query('A > 1')
print(df_filtered)

13. 處理遺漏值與異常值 (進階)

  • 使用中位數、平均值、眾數填補遺漏值
  • 移除或更正異常值
# 範例
df = pd.DataFrame({
    'A': [1, 2, np.nan, 4, 5],
    'B': [5, np.nan, np.nan, 8, 9]
})

# 使用 fillna 填補遺漏值
df.fillna(value={'A': 0, 'B': 0}, inplace=True)
print(df)

# 移除或更正異常值
df = pd.DataFrame({
    'A': [10, 20, 30, 1000, 50],
    'B': [5, 5, 5, 5000, 5]
})
df[df > 100] = np.nan
print(df)

14. 數據正規化 (進階)

  • 使用 scikit-learn 的 MinMaxScaler
from sklearn.preprocessing import MinMaxScaler

# 範例
data = {'Salary': [50000, 60000, 70000], 'Score': [3.5, 4.2, 5.0]}
df = pd.DataFrame(data)

scaler = MinMaxScaler()
df[['Salary', 'Score']] = scaler.fit_transform(df[['Salary', 'Score']])
print(df)