學習 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. 資料操作與變換
- 行的操作
- 列的操作
- 資料的聚合與群組運算
- 資料合併:
concat
和merge
# 範例資料集
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)