Python statistics.median() 方法(长文解析)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
- 《从零手撸:仿小红书(微服务架构)》 已完结,基于
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+ 小伙伴加入学习 ,欢迎点击围观
前言
在数据分析与统计学领域,中位数是一个衡量数据集中趋势的核心指标。它能够有效反映数据的“中心位置”,尤其在存在极端值(如异常值或偏态分布)时,比平均值更具鲁棒性。Python 的 statistics.median()
方法正是实现这一功能的便捷工具。本文将从零开始,通过案例、代码与直观解释,深入探讨该方法的使用场景、参数特性及背后的逻辑原理,帮助读者快速掌握这一实用技能。
一、什么是中位数?为什么需要它?
1.1 中位数的定义与作用
中位数是指将一组数据按大小顺序排列后位于中间位置的数值。例如,对于数据集 [1, 3, 5, 7, 9]
,中位数是 5;而偶数个数据时(如 [2, 4, 6, 8]
),中位数则是中间两个数的平均值,即 5。
中位数的核心优势在于:
- 抗干扰性:不受极端值影响,适合处理收入分布、房价等存在“长尾”现象的数据;
- 直观性:能快速定位数据“中间分界点”,便于对比不同群体的中心趋势。
1.2 中位数 vs 平均数:一个生动的比喻
假设一个班级学生的月均零花钱如下:
salaries = [100, 120, 150, 130, 140, 1000]
计算平均值时,1000 元的异常值会显著抬高结果,而中位数则能“过滤”异常值,更真实地反映多数人的消费水平。这就像用刀切蛋糕时,中位数是“一刀两半”的中间位置,而平均数是“混合所有碎块后的均匀分布”。
二、statistics.median() 方法的语法与基础用法
2.1 方法的官方定义
statistics.median(data)
是 Python 标准库 statistics
模块提供的函数,其核心功能是返回给定数据的中位数。调用前需先导入模块:
import statistics
2.2 基本案例:计算简单数据集的中位数
案例 1:奇数个元素
data_odd = [5, 1, 9, 3, 7]
median_odd = statistics.median(data_odd)
print("奇数个元素的中位数:", median_odd) # 输出:5
案例 2:偶数个元素
data_even = [2, 4, 6, 8]
median_even = statistics.median(data_even)
print("偶数个元素的中位数:", median_even) # 输出:5.0
2.3 支持的数据类型
该方法接受所有可迭代对象,例如列表、元组或生成器:
median_tuple = statistics.median((10, 20, 30, 40))
print(median_tuple) # 输出:25.0
median_gen = statistics.median(x for x in range(5))
print(median_gen) # 输出:2
三、深入理解:median() 的计算逻辑与注意事项
3.1 计算步骤解析
statistics.median()
的内部逻辑可分解为以下三步:
- 排序数据:将输入数据按升序排列;
- 确定中间位置:若数据长度为奇数,取中间元素;若为偶数,则取中间两数的平均值;
- 返回结果:以浮点数形式输出(即使结果为整数,如
5.0
)。
逻辑验证示例
data = [3, 1, 4, 1, 5, 9, 2]
sorted_data = sorted(data) # 排序后:[1, 1, 2, 3, 4, 5, 9]
n = len(sorted_data)
if n % 2 == 1:
median = sorted_data[n//2]
else:
median = (sorted_data[(n//2)-1] + sorted_data[n//2]) / 2
print(median) # 输出:3
3.2 特殊场景与异常处理
3.2.1 空数据集的报错
若传入空列表或空迭代器,会触发 StatisticsError
:
try:
statistics.median([])
except statistics.StatisticsError as e:
print("错误原因:", e) # 输出:"no median for empty data"
3.2.2 非数值数据的兼容性
输入数据需为数值类型(如整数、浮点数),否则会引发 TypeError
:
invalid_data = ["apple", "banana", "cherry"]
statistics.median(invalid_data) # 报错:unsupported operand type(s)
四、实战应用:median() 在数据分析中的场景
4.1 场景 1:分析用户年龄分布
假设某 App 的用户年龄数据如下:
ages = [18, 25, 30, 22, 19, 28, 24, 20, 21, 95]
median_age = statistics.median(ages)
print("用户年龄中位数:", median_age) # 输出:22.5
中位数 22.5 年龄更真实地反映了用户群体的“中间水平”,而平均值会被 95 岁的异常值抬高至约 30.5。
4.2 场景 2:处理缺失值(NaN)
若数据中存在 NaN
值,需先过滤或填充:
import math
data_with_nan = [10, 20, math.nan, 30, 40]
clean_data = [x for x in data_with_nan if not math.isnan(x)]
print("过滤后的中位数:", statistics.median(clean_data)) # 输出:30.0
filled_data = [0 if math.isnan(x) else x for x in data_with_nan]
print("填充后的中位数:", statistics.median(filled_data)) # 输出:20.0
4.3 场景 3:对比不同分组的中位数
通过分组计算,可快速比较不同群体的差异:
group_a = [50, 60, 70, 80, 90]
group_b = [30, 40, 50, 60, 70, 80]
print("组 A 中位数:", statistics.median(group_a)) # 70
print("组 B 中位数:", statistics.median(group_b)) # 55.0
五、与相关方法的对比:median() 的“兄弟函数”
5.1 statistics.mean():计算平均值
data = [1, 2, 3, 4, 5]
print("平均值:", statistics.mean(data)) # 3.0
print("中位数:", statistics.median(data)) # 3
5.2 statistics.mode():寻找众数
data_mode = [1, 2, 2, 3, 3, 3]
print("众数:", statistics.mode(data_mode)) # 3
5.3 numpy.median():高效处理大型数组
对于大规模数据,numpy
的实现通常更快:
import numpy as np
large_data = np.random.randint(0, 100, 10000)
print("Numpy 中位数:", np.median(large_data))
六、进阶技巧:定制化与扩展
6.1 自定义排序规则
若需按特定逻辑(如降序)计算中位数,可先手动排序:
data_desc = [9, 7, 5, 3, 1]
sorted_data = sorted(data_desc) # 升序排列为 [1, 3, 5, 7, 9]
print("强制升序后的中位数:", statistics.median(sorted_data)) # 5
6.2 处理分位数(Quantiles)
中位数是第二四分位数(50% 分位数),若需计算其他分位数,可借助 statistics.quantiles()
:
from statistics import quantiles
data = [1, 2, 3, 4, 5, 6, 7, 8]
print("分位数结果:", quantiles(data, n=4)) # 输出:[3.0, 4.5, 6.0]
结论
Python statistics.median()
方法凭借其简洁性与直观性,成为统计分析中不可或缺的工具。无论是基础的数据中心趋势分析,还是复杂的数据清洗与对比,它都能提供高效且可靠的解决方案。通过本文的案例与代码示例,读者可以快速掌握该方法的使用场景与潜在问题,并在实际项目中灵活应用。
下一步行动建议:
- 尝试将
median()
结合pandas
数据框进行批量计算; - 探索
statistics
模块的其他函数(如variance()
、stdev()
); - 对比不同库(如
numpy
、scipy
)在统计计算上的性能差异。
掌握中位数的计算逻辑与实践方法,将为您的数据分析能力增添重要一环!