承接《Pandas 分组操作》,本篇讲解 Pandas 描述性统计全套方法,包含整体统计、分位数、统计量单独获取、分组描述统计、非数值统计、自定义统计、参数配置、缺失值影响,是数据探查、EDA 探索性分析的基础,保持系列教程统一风格。
前置导入与示例数据
import pandas as pd
import numpy as np
df = pd.DataFrame({
"region": ["华东","华东","华南","华南","华北","华北","华东","华南"],
"cate": ["手机","电脑","手机","电脑","手机","电脑","手机","电脑"],
"sales": [1200, 800, 1500, 950, 1100, 780, 1350, 1020],
"profit": [180, 120, 220, 140, 160, 110, 195, 150]
})
print(df)
一、核心函数 describe()
describe() 是最常用的一键描述统计,默认只对数值型列计算:计数、均值、标准差、最小值、25%、50%、75%、最大值。
# 整体描述统计
desc = df.describe()
print(desc)
常用参数
df.describe(
percentiles=None, # 自定义分位数
include=None, # 包含哪些类型
exclude=None, # 排除哪些类型
)
1. 自定义分位数
默认是 [0.25, 0.5, 0.75],可以自己指定:
df.describe(percentiles=[0.1, 0.5, 0.9])
2. include 统计非数值列(分类、字符串)
include="all":所有列一起统计include="object":只统计字符串/文本列
# 同时统计数值 + 分类文本
df.describe(include="all")
文本列的统计指标:count(非空数量)、unique(唯一值)、top(出现最多的值)、freq(top频次)
3. exclude 排除指定类型
df.describe(exclude="number")
二、单独获取各类统计指标
除了 describe,Pandas 提供单列/多列独立统计函数,可直接用于聚合:
# 求和
df["sales"].sum()
# 平均值
df["sales"].mean()
# 中位数
df["sales"].median()
# 众数
df["sales"].mode()
# 标准差(样本标准差,除以 n-1)
df["sales"].std()
# 方差
df["sales"].var()
# 最小值、最大值
df["sales"].min()
df["sales"].max()
# 非空计数
df["sales"].count()
# 空值数量
df["sales"].isna().sum()
# 累积求和
df["sales"].cumsum()
# 累积最大值
df["sales"].cummax()
注意:
std()、var()默认是样本统计量(ddof=1);总体标准差设置ddof=0
df["sales"].std(ddof=0)
三、分位数 quantile
quantile() 单独计算指定分位数,比 describe 更灵活
# 50%分位数 = 中位数
df["sales"].quantile(0.5)
# 多个分位数批量获取
df["sales"].quantile([0.1,0.25,0.5,0.75,0.9])
interpolation 参数控制插值方式:linear、lower、higher、midpoint、nearest
四、分组描述统计(业务高频)
配合 groupby,按维度分组输出描述信息
# 按地区分组,查看销售额描述统计
df.groupby("region")["sales"].describe()
# 多列同时描述
df.groupby("region")[["sales","profit"]].describe()
配合 percentiles 自定义分位数:
df.groupby("region")["sales"].describe(percentiles=[0.05,0.95])
五、统计相关系数与协方差
# 相关系数矩阵
df[["sales","profit"]].corr()
# 协方差矩阵
df[["sales","profit"]].cov()
corr 默认 pearson;还支持 spearman、kendall
df[["sales","profit"]].corr(method="spearman")
六、汇总统计 info() / value_counts
info():看数据类型、内存、缺失情况(不是数值统计,属于探查配套)
df.info()
value_counts():分类值频次统计
df["region"].value_counts()
# 归一化,得到占比
df["region"].value_counts(normalize=True)
# 包含空值
df["region"].value_counts(dropna=False)
七、agg 自定义描述指标组合
想要自由组合输出哪些统计项,使用 agg:
stat = df["sales"].agg([
"count", "mean", "median", "std", "min", "max"
])
print(stat)
多字段,不同指标:
stat_df = df.agg({
"sales": ["sum", "mean", "max"],
"profit": ["sum", "median"]
})
print(stat_df)
八、缺失值对统计的影响
所有统计函数默认 skipna=True,自动忽略 NaN:
# 忽略NaN计算均值(默认)
df["sales"].mean(skipna=True)
# 只要存在NaN,结果直接返回NaN
df["sales"].mean(skipna=False)
坑:空值不会参与 count(),count 只统计非空行。
九、转置、导出报表
describe 结果经常需要转置,方便导出Excel阅读:
desc_t = df.describe().T
# desc_t.to_excel("describe统计结果.xlsx")
print(desc_t)
十、高频坑清单
- describe 默认只统计数值列,字符串列看不到,需要
include="all" - std 是样本标准差,不是总体标准差,做全量统计记得
ddof=0 - quantile 插值方式不同,相同数据结果会有微小差异
- groupby + describe 会生成多层列索引,导出Excel时注意 reset_index
- mean / sum 遇到 NaN 自动跳过,容易低估数据,要先核查缺失占比
- mode 返回Series,一个字段可能存在多个众数
- corr 只能计算数值列,文本列会直接报错
十一、综合实战模板
def get_describe_report(df, num_cols, percentiles=[0.1,0.5,0.9]):
"""生成描述统计报表,转置方便查看"""
report = df[num_cols].describe(percentiles=percentiles).T
# 增加缺失率
report["missing_count"] = len(df) - df[num_cols].count()
report["missing_rate"] = report["missing_count"] / len(df)
return report
def get_group_describe(df, group_col, val_cols):
"""分组描述统计"""
return df.groupby(group_col)[val_cols].describe(percentiles=[0.05,0.95])
# 调用示例
report = get_describe_report(df, ["sales","profit"])
group_report = get_group_describe(df, "region", ["sales"])
print(report)
print(group_report)
十二、速查表
| 需求 | 写法 |
|---|---|
| 一键EDA统计 | df.describe() |
| 自定义分位数 | describe(percentiles=[0.1,0.9]) |
| 文本分类频次 | value_counts() |
| 相关系数 | corr() |
| 分组统计描述 | groupby + describe |
| 不跳过NaN | mean(skipna=False) |
| 总体标准差 | std(ddof=0) |
0 条笔记