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() 的内部逻辑可分解为以下三步:

  1. 排序数据:将输入数据按升序排列;
  2. 确定中间位置:若数据长度为奇数,取中间元素;若为偶数,则取中间两数的平均值;
  3. 返回结果:以浮点数形式输出(即使结果为整数,如 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() 方法凭借其简洁性与直观性,成为统计分析中不可或缺的工具。无论是基础的数据中心趋势分析,还是复杂的数据清洗与对比,它都能提供高效且可靠的解决方案。通过本文的案例与代码示例,读者可以快速掌握该方法的使用场景与潜在问题,并在实际项目中灵活应用。

下一步行动建议

  1. 尝试将 median() 结合 pandas 数据框进行批量计算;
  2. 探索 statistics 模块的其他函数(如 variance()stdev());
  3. 对比不同库(如 numpyscipy)在统计计算上的性能差异。

掌握中位数的计算逻辑与实践方法,将为您的数据分析能力增添重要一环!

最新发布