Python statistics.mean() 方法(超详细)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
引言:为什么需要统计学函数?
在数据分析和编程领域,统计学是解决问题的核心工具之一。无论是计算用户行为的平均停留时长,还是分析产品销售的平均增长率,平均数(mean)都是最基础也最常用的指标。Python的statistics
模块提供了mean()
方法,这个方法以简洁的方式实现了数学上的平均数计算。本文将深入讲解这个方法的使用技巧、潜在陷阱和实际应用场景,帮助开发者快速掌握这一工具。
一、statistics.mean() 方法简介
1.1 基本概念:平均数是什么?
平均数是统计学中最直观的指标之一。想象一个场景:班级里有5个学生,他们的数学成绩分别是80、85、90、95、100分。平均数就是将这些数值相加后除以数量,即:
[
\text{平均分} = \frac{80 + 85 + 90 + 95 + 100}{5} = 90
]
statistics.mean()
方法正是通过这样的计算逻辑,将输入的数据集转化为一个代表性的数值。
1.2 方法签名与输入要求
statistics.mean(data)
- 参数
data
:必须是一个可迭代对象(如列表、元组),且其中的元素必须是数字类型(整数或浮点数)。 - 返回值:计算后的浮点数,即使输入全是整数也会返回浮点类型。
注意:如果输入数据为空,会抛出statistics.StatisticsError
异常。
二、基础用法与示例
2.1 最简单的平均数计算
import statistics
scores = [80, 85, 90, 95, 100]
average = statistics.mean(scores)
print(average) # 输出 90.0
这里,scores
列表中的5个整数被转换为浮点数进行计算,最终结果保留小数点后一位。
2.2 处理混合数据类型
如果数据中包含非数字类型,会引发错误:
mixed_data = [10, 20, "30", 40]
try:
statistics.mean(mixed_data)
except TypeError as e:
print(e) # 输出:can't convert string to float: '30'
解决方法是确保所有元素可转换为数值,例如:
clean_data = [float(x) for x in mixed_data if isinstance(x, (int, float))]
2.3 异常处理:空列表的应对策略
empty_list = []
try:
statistics.mean(empty_list)
except statistics.StatisticsError as e:
print(e) # 输出:mean requires at least one data point
实践中,可以通过条件判断或默认值处理这种情况:
def safe_mean(data):
return statistics.mean(data) if len(data) > 0 else 0.0
三、与 numpy.mean() 的对比:选择哪个更好?
3.1 核心区别:适用场景不同
-
statistics.mean():
- 依赖Python标准库,无需额外安装。
- 适合小型数据集,计算简单且直观。
- 对输入类型检查严格,会抛出明确错误。
-
numpy.mean():
- 需要安装第三方库(
pip install numpy
)。 - 专为大型数组优化,执行速度更快。
- 支持多维数组和更复杂的参数设置(如指定轴向计算)。
- 需要安装第三方库(
3.2 性能对比示例
import numpy as np
import statistics
import time
data = np.random.rand(1000000).tolist()
start = time.time()
statistics.mean(data)
print(f"statistics.mean() 耗时: {time.time()-start:.4f}秒")
start = time.time()
np.mean(data)
print(f"numpy.mean() 耗时: {time.time()-start:.4f}秒")
输出可能类似:
statistics.mean() 耗时: 0.2314秒
numpy.mean() 耗时: 0.0032秒
这表明,当数据量极大时,numpy
的性能优势显著。
四、实际应用场景与案例
4.1 学生成绩分析
假设需要计算多个班级的平均分:
class_scores = {
"Class A": [78, 82, 95, 88, 76],
"Class B": [85, 90, 92, 89, 87],
"Class C": [70, 75, 80, 85, 90]
}
for class_name, scores in class_scores.items():
avg = statistics.mean(scores)
print(f"{class_name} 平均分:{avg:.1f}")
输出:
Class A 平均分:83.8
Class B 平均分:88.6
Class C 平均分:82.0
4.2 异常值处理:结合统计学方法
平均数容易受极端值影响。例如:
data_with_outlier = [10, 12, 15, 1000]
print(f"原始平均值:{statistics.mean(data_with_outlier):.1f}") # 266.8
此时可能需要结合中位数(statistics.median()
)来获得更稳健的指标:
median_value = statistics.median(data_with_outlier)
print(f"中位数:{median_value}") # 输出 13.5
五、进阶技巧与注意事项
5.1 处理浮点数精度问题
由于浮点数计算存在精度误差,建议使用decimal
模块:
from decimal import Decimal
def precise_mean(data):
return statistics.mean([Decimal(str(x)) for x in data])
print(precise_mean([0.1, 0.1, 0.1])) # 输出 0.1 而非 0.30000000000000004
5.2 与数学期望的联系
在概率论中,平均数是离散随机变量的期望值。例如掷骰子的期望值:
dice_rolls = [1, 2, 3, 4, 5, 6]
expected_value = statistics.mean(dice_rolls)
print(f"期望值:{expected_value}") # 输出 3.5
六、常见问题解答
Q1:为什么得到的是浮点数而非整数?
A:mean()
方法始终返回浮点数以确保精度。例如,输入[2, 4]
的平均值为3.0
而非3
。
Q2:能否计算加权平均数?
A:statistics
模块不直接支持,但可通过手动计算实现:
values = [10, 20, 30]
weights = [1, 2, 3]
weighted_sum = sum(v * w for v, w in zip(values, weights))
total_weight = sum(weights)
weighted_mean = weighted_sum / total_weight
print(weighted_mean) # 输出 23.333...
Q3:如何处理字符串形式的数值?
A:先转换为数值类型:
string_numbers = ["5", "10", "15"]
numbers = [float(num) for num in string_numbers]
print(statistics.mean(numbers)) # 输出 10.0
结论:让统计学为代码赋能
Python statistics.mean()
方法以其简洁性和直观性,成为开发者快速获取数据平均值的利器。无论是分析用户行为数据,还是处理科学实验结果,它都能提供可靠的基础支持。但需注意其与numpy
方法的性能差异,以及在异常值和数据类型上的限制。通过结合其他统计方法(如中位数、标准差),开发者可以构建更健壮的数据分析流程。掌握这一工具,不仅能提升代码效率,更能帮助你在数据驱动的世界中做出更明智的决策。
通过本文的系统讲解,读者应能全面理解statistics.mean()
方法的使用场景、实现原理和优化技巧。建议在实际项目中多加实践,逐步积累统计学与编程结合的经验。