statistics.median()要求输入为非空可迭代对象且元素全为数字,否则报错;stdev()用于样本标准差(n−1),pstdev()用于总体标准差(n);所有函数均不处理缺失值或类型转换。

statistics.median() 计算中位数时,输入必须是可迭代对象
直接传入单个数字或 None 会报 TypeError: 'int' object is not iterable。它不接受 NumPy 数组或 pandas Series(除非显式转成 list)。
常见错误场景:从 CSV 读取一列数据后忘记用 list() 包裹,或者误把 scalar 当作序列传入。
- ✅ 正确写法:
statistics.median([1, 3, 5, 7, 9])或statistics.median(data_list) - ❌ 错误写法:
statistics.median(5)、statistics.median(df['col'].values)(NumPy array)、statistics.median([])(空列表会抛StatisticsError) - 注意:对偶数个元素,它自动取中间两数的平均值,比如
statistics.median([2, 4])返回3.0,结果始终是 float
statistics.stdev() 和 statistics.pstdev() 的区别不能搞混
标准差分「样本标准差」和「总体标准差」,对应函数分别是 stdev()(n−1 自由度)和 pstdev()(n 自由度)。用错会导致结果偏差约 5–10%,尤其在小数据集上明显。
典型误用:用 stdev() 计算全量用户停留时长(即你已拥有全部总体),或用 pstdev() 分析抽样调查问卷(仅 200 份样本)。
- ✅ 样本场景(推断总体)→ 用
statistics.stdev([x1, x2, ..., xn]) - ✅ 总体场景(数据就是全部)→ 用
statistics.pstdev([x1, x2, ..., xN]) - ⚠️ 两者都要求至少两个元素;传入单元素会抛
StatisticsError: stdev requires at least two data points
空数据或非数值类型会直接抛异常,别指望它静默处理
statistics 模块所有统计函数都不做类型转换或缺失值过滤。遇到 None、字符串 "missing"、甚至 float('nan') 都会立即报错,不是返回 NaN 或跳过。
例如:statistics.median([1, 2, None, 4]) 报 TypeError: ';<code>statistics.stdev(['1','2','3']) 报 TypeError: unsupported operand type(s) for -: 'str' and 'str'。
- 预处理建议:先用列表推导式清洗,如
clean_data = [x for x in raw_data if isinstance(x, (int, float)) and not math.isnan(x)] - 空列表检查必须手动加:调用前判断
if not data:,否则必然崩溃 - 它也不支持 decimal.Decimal 或 fractions.Fraction 类型(会报 TypeError),需提前转为 float 或 int
性能和替代方案:小数据快,大数据慎用
statistics 是纯 Python 实现,没做底层优化。对几千以内数据没问题,但一旦超过 10 万条数值,比 numpy.std() 慢 5–10 倍,且内存占用更高(因要多次遍历)。
如果你已经在用 pandas 或 NumPy,硬切回 statistics 反而增加维护成本,还容易忽略 axis、ddof 等细节差异。
- 纯脚本/教学场景、数据量 statistics,简洁无依赖
- 已有 NumPy → 用
np.median(arr)和np.std(arr, ddof=1)(对应 stdev)更稳 - 注意:
numpy.std()默认是总体标准差(ddof=0),要模拟stdev()得显式写ddof=1
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











