
🧪GroupBy能做什麼?
groupby() 可將資料依照欄位分組,接著對每個群體套用統計或轉換函式,如同 SQL 中的 GROUP BY。 善用groupby()可以讓自己資料處理能力更上一層!!!
📌語法結構
df.groupby("欄位")[數值欄位].聚合函式()
🧱示意圖

df.groupby("Category")["Sales"].sum()
→ A: 100 + 300 = 400 B: 200 + 400 = 600
🔢常見聚合函式

📘 範例
import pandas as pd
df = pd.DataFrame({
'Department': ['Sales', 'Sales', 'HR', 'HR', 'IT'],
'Employee': ['Amy', 'Ben', 'Cara', 'Dan', 'Eve'],
'Salary': [70000, 80000, 60000, 62000, 75000],
'Bonus': [5000, 6000, 2000, 2500, 4000]
})
🎯範例1: 各部門薪資總和
df.groupby("Department")["Salary"].sum()
# 輸出
Department
HR 122000
IT 75000
Sales 150000
🎯範例2: 各部門薪資與獎金平均
df.groupby("Department")[["Salary", "Bonus"]].mean()
# 輸出
Salary Bonus
Department
HR 61000.0 2250.0
IT 75000.0 4000.0
Sales 75000.0 5500.0
🎯範例3: 統計摘要: .describe()
df.groupby("Department")["Salary"].describe()
# 輸出
count mean std ... 50% 75% max
Department ...
HR 2.0 61000.0 1414.213562 ... 61000.0 61500.0 62000.0
IT 1.0 75000.0 NaN ... 75000.0 75000.0 75000.0
Sales 2.0 75000.0 7071.067812 ... 75000.0 77500.0 80000.0
🧠說明
統計摘要這些資訊是我們初步了解資料時非常重要的部分!!! 唯有清楚資料的長相和特性後,才能正確地清理資料,去除雜訊,保留最有用的資訊!!!
📌 輸出欄位包含:count, mean, std, min, 25%, 50%, 75%, max
🎯 範例4: 多欄位分組
df.groupby(["Department", "Employee"])["Salary"].mean()
# 輸出
Department Employee
HR Cara 60000.0
Dan 62000.0
IT Eve 75000.0
Sales Amy 70000.0
Ben 80000.0
🎯範例5: 結合自訂函式與 agg()
df.groupby("Department")["Salary"].agg(['mean', 'max', 'std'])
df.groupby("Department").agg(
Salary_Avg=('Salary', 'mean'),
Bonus_Sum=('Bonus', 'sum')
)
# 輸出
mean max std
Department
HR 61000.0 62000 1414.213562
IT 75000.0 75000 NaN
Sales 75000.0 80000 7071.067812
Salary_Avg Bonus_Sum
Department
HR 61000.0 4500
IT 75000.0 4000
Sales 75000.0 11000
📊範例6: 簡單視覺化一下
df.groupby("Department")["Salary"].mean().plot(kind='bar', title="Avg Salary by Dept")

📚統計分析與資料摘要
當我們拿到資料的第一步就是要先了解資料的長相與特性,使用Pandas讀取資料後可以直接進行初步的統計分析,有助於後續資料清理的工作!!! 實務上,了解資料特性時還會搭配視覺化來呈現,我在視覺化的文章裡會再多著墨。 這部分所提到的一些統計分析報表都是EXCEL裡面會有的,因此習慣EXCEL的人也可以在Pandas中找到類似的方式來使用。
📌 1. 常用統計方法

df[["Salary", "Bonus"]].corr()
# 輸出
Salary Bonus
Salary 1.000000 0.911569
Bonus 0.911569 1.000000
說明
- 數值越接近+1代表正相關性越大
- 數值越接近0代表相關性越小
- 數值越接近-1代表負相關性越大
🔎 應用場景:找出欄位間的線性相關性
📌 2. Pivot Table:類似 Excel 樞紐分析表
df.pivot_table(
index='Department', # 分組依據
values='Salary',
aggfunc='mean' # 聚合函式
)
# 輸出
Salary
Department
HR 61000.0
IT 75000.0
Sales 75000.0
說明
👉 可搭配 columns= 做交叉維度
📌 3. Crosstab:列聯表(分類統計)
pd.crosstab(df["Department"], df["Bonus"] > 3000)
# 輸出
Bonus False True
Department
HR 2 0
IT 0 1
Sales 0 2
說明
🔎 應用場景:統計分類交叉分佈,適合類別資料頻率分析
📌 4. 分組後排序 .sort_values()
df.groupby("Department")["Salary"].mean().sort_values(ascending=False)
# 輸出
Department
IT 75000.0
Sales 75000.0
HR 61000.0
說明
- 可由ascending調整降冪還是升冪