describe() 默认仅对数值列生效,非数值列被跳过;若全为object类型则返回空或仅离散指标,需用dtypes检查、to_numeric转换或include="all"参数解决。

直接用 describe() 就能快速拿到数值列的统计摘要,但默认只对数值型列生效,非数值列(如字符串)会被自动跳过——这点常被忽略,导致你以为数据“没显示”,其实是类型不对。
为什么 describe() 有时返回空或列数很少?
这是最常见的困惑来源。Pandas 默认只对 numeric 类型列计算统计量(计数、均值、标准差、四分位数等)。如果 DataFrame 里全是 object 类型(比如读取 CSV 时未指定 dtype,数字被当字符串读入),describe() 就会返回一个空表,或仅返回 count 和 unique 等离散指标。
- 检查列类型:用
df.dtypes确认数值列是否为int64或float64 - 强制转换:对疑似数字的列运行
df["col"] = pd.to_numeric(df["col"], errors="coerce") - 显式要求所有列参与:加参数
include="all",此时会对数值列和非数值列分别输出不同指标
describe() 的常用参数组合与效果差异
不加参数最省事,但实际分析中往往需要微调:
-
df.describe():仅数值列,5 个分位点(0%, 25%, 50%, 75%, 100%)+ 均值、标准差、计数 -
df.describe(percentiles=[.1, .9]):自定义分位点,比如看 10% 和 90% 分位值 -
df.describe(include="all"):数值列输出常规统计量;非数值列输出count、unique、top(最频繁值)、freq(频次) -
df.describe(exclude=["number"]):反向筛选,只看非数值列
注意:include 和 exclude 不能同时使用,否则报错 ValueError: include and exclude cannot be used together。
如何让 describe() 包含分类变量的统计(比如众数、分布)
默认模式下,describe() 对 object 或 category 列只给基础离散指标,不够深入。想看每个类别的频次占比,得换方法:
- 单列频次:用
df["col"].value_counts(normalize=True)得到比例 - 多列汇总:写个小循环或用
df.select_dtypes("object").apply(lambda s: s.value_counts().head(3))查看各列前 3 高频值 - 配合
crosstab:比如pd.crosstab(df["gender"], df["region"])看交叉分布
别指望 describe() 自动做这些——它定位是“快速概览”,不是“深度探索”。
真正容易卡住的地方,往往是数据类型没清理干净就急着调 describe(),结果看到空表就以为函数坏了。先跑一遍 df.info() 和 df.head(),比反复查文档更快。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











