自学教程 学编程从这里开始

Pandas 描述性统计

承接《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)

十、高频坑清单

  1. describe 默认只统计数值列,字符串列看不到,需要 include="all"
  2. std 是样本标准差,不是总体标准差,做全量统计记得 ddof=0
  3. quantile 插值方式不同,相同数据结果会有微小差异
  4. groupby + describe 会生成多层列索引,导出Excel时注意 reset_index
  5. mean / sum 遇到 NaN 自动跳过,容易低估数据,要先核查缺失占比
  6. mode 返回Series,一个字段可能存在多个众数
  7. 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
不跳过NaNmean(skipna=False)
总体标准差std(ddof=0)

标签:

0 条笔记