Pandas 統計分析
Pandas 提供了豐富的統計方法,可以快速計算資料的各種統計值。
範例資料
import pandas as pd
import numpy as np
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
'age': [25, 30, 35, 28, 32],
'salary': [50000, 60000, 70000, 55000, 65000],
'bonus': [5000, 8000, None, 6000, 7000]
})
基本統計方法
數量
# 非空值數量
print(df['age'].count()) # 5
print(df['bonus'].count()) # 4(有一個空值)
# DataFrame 的所有欄位
print(df.count())
總和
print(df['salary'].sum()) # 300000
# 所有數值欄位的總和
print(df.sum(numeric_only=True))
平均值
print(df['salary'].mean()) # 60000.0
# 所有數值欄位的平均
print(df.mean(numeric_only=True))
中位數
print(df['salary'].median()) # 60000.0
最大值和最小值
print(df['salary'].max()) # 70000
print(df['salary'].min()) # 50000
# 取得最大值的索引
print(df['salary'].idxmax()) # 2
print(df['salary'].idxmin()) # 0
標準差和變異數
print(df['salary'].std()) # 標準差
print(df['salary'].var()) # 變異數
多個統計值
describe()
一次取得多個統計值:
print(df['salary'].describe())
count 5.000000
mean 60000.000000
std 7905.694150
min 50000.000000
25% 55000.000000
50% 60000.000000
75% 65000.000000
max 70000.000000
Name: salary, dtype: float64
agg()
自訂要計算的統計值:
# 計算多個統計值
print(df['salary'].agg(['mean', 'std', 'min', 'max']))
# 對不同欄位計算不同統計值
print(df.agg({
'salary': ['mean', 'max'],
'age': ['min', 'max']
}))
累計統計
累計總和
print(df['salary'].cumsum())
0 50000
1 110000
2 180000
3 235000
4 300000
Name: salary, dtype: int64
累計最大/最小值
print(df['salary'].cummax())
print(df['salary'].cummin())
累計乘積
print(df['age'].cumprod())
百分位數和分位數
# 中位數(50%)
print(df['salary'].quantile(0.5)) # 60000.0
# 多個分位數
print(df['salary'].quantile([0.25, 0.5, 0.75]))
# 百分位排名
print(df['salary'].rank(pct=True))
相關性分析
相關係數
# 兩個欄位的相關係數
print(df['age'].corr(df['salary']))
# 所有數值欄位的相關係數矩陣
print(df.corr(numeric_only=True))
共變異數
print(df['age'].cov(df['salary']))
# 共變異數矩陣
print(df.cov(numeric_only=True))
排名
print(df['salary'].rank())
0 1.0
1 3.0
2 5.0
3 2.0
4 4.0
Name: salary, dtype: float64
# 降冪排名
print(df['salary'].rank(ascending=False))
# 處理相同值的方式
print(df['salary'].rank(method='min')) # 相同值取最小排名
print(df['salary'].rank(method='max')) # 相同值取最大排名
print(df['salary'].rank(method='average')) # 相同值取平均排名(預設)
處理空值
統計方法預設會忽略空值(NaN):
s = pd.Series([1, 2, None, 4, 5])
print(s.sum()) # 12(忽略 None)
print(s.mean()) # 3.0
print(s.count()) # 4
如果要包含空值:
# skipna=False 會讓結果變成 NaN
print(s.sum(skipna=False)) # nan
按欄位或按列計算
# axis=0(預設):對每個欄位計算
print(df.sum(numeric_only=True))
# axis=1:對每一列計算
print(df[['salary', 'bonus']].sum(axis=1))
統計方法總覽
| 方法 | 說明 |
|---|---|
count() | 非空值數量 |
sum() | 總和 |
mean() | 平均值 |
median() | 中位數 |
std() | 標準差 |
var() | 變異數 |
min() | 最小值 |
max() | 最大值 |
idxmin() | 最小值的索引 |
idxmax() | 最大值的索引 |
quantile() | 分位數 |
cumsum() | 累計總和 |
cumprod() | 累計乘積 |
cummax() | 累計最大值 |
cummin() | 累計最小值 |
corr() | 相關係數 |
cov() | 共變異數 |
rank() | 排名 |