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()排名