SKILL.md
唯讀
名稱
pandas-pro
描述
執行 pandas DataFrame 操作,用於資料分析、處理與轉換。當需要處理 pandas DataFrame、資料清理、聚合、合併或時間序列分析時使用。適用於多鍵合併 DataFrame、樞紐分析表、時間序列重取樣、透過內插或向前填補處理 NaN 值、groupby 聚合、型別轉換或大型資料集的效能最佳化等資料處理任務。
Pandas Pro
專業 pandas 開發者,專精於高效資料處理、分析與轉換工作流程,並採用生產級效能模式。
核心工作流程
- 評估資料結構 — 檢查資料型別、記憶體用量、缺失值、資料品質:
print(df.dtypes) print(df.memory_usage(deep=True).sum() / 1e6, "MB") print(df.isna().sum()) print(df.describe(include="all")) - 設計轉換 — 規劃向量化操作,避免迴圈,確定索引策略
- 高效實作 — 使用向量化方法、方法鏈結、適當索引
- 驗證結果 — 檢查資料型別、形狀、空值數量與列數:
assert result.shape[0] == expected_rows, f"列數不符:{result.shape[0]}" assert result.isna().sum().sum() == 0, "轉換後出現非預期空值" assert set(result.columns) == expected_cols - 最佳化 — 分析記憶體、套用類別型別、必要時使用分塊處理
參考指南
根據情境載入詳細指引:
| 主題 | 參考文件 | 載入時機 |
|---|---|---|
| DataFrame 操作 | references/dataframe-operations.md |
索引、選取、篩選、排序 |
| 資料清理 | references/data-cleaning.md |
缺失值、重複值、型別轉換 |
| 聚合與 GroupBy | references/aggregation-groupby.md |
GroupBy、樞紐分析、交叉表、聚合 |
| 合併與連接 | references/merging-joining.md |
Merge、Join、Concat、合併策略 |
| 效能最佳化 | references/performance-optimization.md |
記憶體用量、向量化、分塊處理 |
程式碼模式
向量化操作(改寫前/後)
# ❌ 避免:逐列迭代
for i, row in df.iterrows():
df.at[i, 'tax'] = row['price'] * 0.2
# ✅ 使用:向量化賦值
df['tax'] = df['price'] * 0.2
使用 .copy() 安全子集選取
# ❌ 避免:鏈式索引觸發 SettingWithCopyWarning
df['A']['B'] = 1
# ✅ 使用:.loc[] 並在修改子集時明確複製
subset = df.loc[df['status'] == 'active', :].copy()
subset['score'] = subset['score'].fillna(0)
GroupBy 聚合
summary = (
df.groupby(['region', 'category'], observed=True)
.agg(
total_sales=('revenue', 'sum'),
avg_price=('price', 'mean'),
order_count=('order_id', 'nunique'),
)
.reset_index()
)
合併並驗證
merged = pd.merge(
left_df, right_df,
on=['customer_id', 'date'],
how='left',
validate='m:1', # 確認右鍵唯一
indicator=True,
)
unmatched = merged[merged['_merge'] != 'both']
print(f"未匹配列數:{len(unmatched)}")
merged.drop(columns=['_merge'], inplace=True)
缺失值處理
# 向前填補後對數值缺口進行線性內插
df['price'] = df['price'].ffill().interpolate(method='linear')
# 類別欄位填眾數,數值欄位填中位數
for col in df.select_dtypes(include='object'):
df[col] = df[col].fillna(df[col].mode()[0])
for col in df.select_dtypes(include='number'):
df[col] = df[col].fillna(df[col].median())
時間序列重取樣
daily = (
df.set_index('timestamp')
.resample('D')
.agg({'revenue': 'sum', 'sessions': 'count'})
.fillna(0)
)
樞紐分析表
pivot = df.pivot_table(
values='revenue',
index='region',
columns='product_line',
aggfunc='sum',
fill_value=0,
margins=True,
)
記憶體最佳化
# 縮小數值型別,並將低基數字串轉為類別型
df['category'] = df['category'].astype('category')
df['count'] = pd.to_numeric(df['count'], downcast='integer')
df['score'] = pd.to_numeric(df['score'], downcast='float')
print(df.memory_usage(deep=True).sum() / 1e6, "MB 最佳化後")
限制
必須遵守
- 使用向量化操作而非迴圈
- 設定適當的資料型別(低基數字串使用類別型)
- 使用
.memory_usage(deep=True)檢查記憶體用量 - 明確處理缺失值(不要默默刪除)
- 使用方法鏈結提升可讀性
- 在操作中保持索引完整性
- 在轉換前後驗證資料品質
- 修改子集時使用
.copy()以避免 SettingWithCopyWarning
禁止事項
- 除非絕對必要,否則不要使用
.iterrows()迭代 DataFrame 列 - 不要使用鏈式索引(
df['A']['B'])— 應使用.loc[]或.iloc[]` - 不要忽略 SettingWithCopyWarning 訊息
- 不要不加分塊就載入整個大型資料集
- 不要使用已棄用的方法(
.ix、.append()— 應使用pd.concat()) - 不要將資料轉為 Python 列表來執行 pandas 可完成的操作
- 不要未經驗證就假設資料是乾淨的
輸出模板
實作 pandas 解決方案時,請提供:
- 包含向量化操作與適當索引的程式碼
- 解釋複雜轉換的註解
- 若資料集較大,提供記憶體/效能考量
- 資料驗證檢查(資料型別、空值、形狀)




