Python statistics.median() 方法(千字长文)

Python statistics.median() 方法:轻松掌握数据中位数计算

在数据分析的世界里,中位数是一个非常基础但极其重要的统计指标。它不像平均数那样容易被极端值“拉偏”,在处理真实世界的数据时,常常比平均数更具有代表性。Python 的 statistics 模块为此提供了 median() 方法,让计算中位数变得简单而高效。

如果你正在学习 Python,或者已经在项目中处理数据,那么掌握这个方法将极大提升你的数据处理能力。它不仅语法简洁,而且逻辑清晰,特别适合初学者快速上手。


什么是中位数?用生活化比喻来理解

想象你有一群人排队买票,每个人的身高各不相同。如果把他们按身高从矮到高排好,站在中间位置的人的身高,就是这队人的“中位数”。

这个位置的人,左边和右边的人数大致相等。即使有人特别高或特别矮,也不会影响中间这个人的位置。这就是中位数的核心意义:它反映的是“中间水平”,而不是“平均情况”。

在实际场景中,比如统计一个城市居民的收入水平,如果少数人收入极高,拉高了平均值,那么中位数反而能更真实地体现“普通人”的收入状况。


Python statistics.median() 方法的基本用法

Python 的 statistics 模块是标准库的一部分,无需额外安装,直接导入即可使用。median() 方法用于计算一组数值的中位数。

import statistics

scores = [85, 90, 78, 92, 88, 80, 95]

median_score = statistics.median(scores)

print(f"学生成绩的中位数是:{median_score}")

输出结果:

学生成绩的中位数是:88

代码注释:

  • import statistics:导入标准库中的统计模块,提供中位数、平均数等方法。
  • scores = [...]:定义一个包含 7 个成绩的列表。
  • statistics.median(scores):调用 median() 方法,传入数据列表,返回中位数。
  • print():输出结果,帮助我们查看计算结果。

⚠️ 注意:median() 方法会自动对输入数据进行排序,无需手动排序。


奇数个与偶数个数据的中位数计算逻辑

中位数的计算方式取决于数据个数是奇数还是偶数,这就像“中间点”的位置不同。

奇数个数据:取正中间的值

当数据个数为奇数时,中位数就是排序后正中间的那个数。

import statistics

data_odd = [10, 20, 30, 40, 50]

median_odd = statistics.median(data_odd)

print(f"奇数个数据的中位数:{median_odd}")

输出:

奇数个数据的中位数:30

解释: 排序后为 [10, 20, 30, 40, 50],中间位置是第 3 个(索引为 2),值为 30。

偶数个数据:取中间两个数的平均值

当数据个数为偶数时,中位数是中间两个数的平均值。

import statistics

data_even = [10, 20, 30, 40, 50, 60]

median_even = statistics.median(data_even)

print(f"偶数个数据的中位数:{median_even}")

输出:

偶数个数据的中位数:35.0

解释: 排序后为 [10, 20, 30, 40, 50, 60],中间两个数是 30 和 40,平均值为 (30 + 40) / 2 = 35.0。

✅ 小贴士:statistics.median() 会自动处理奇偶情况,开发者无需关心内部逻辑。


实际应用场景:分析学生考试成绩分布

假设你是一位老师,手上有 20 名学生的数学考试成绩,想了解整体表现水平。平均分可能受极少数高分或低分影响,而中位数更能反映“大多数学生”的真实水平。

import statistics

math_scores = [
    75, 82, 68, 90, 77, 85, 93, 70, 88, 79,
    91, 83, 76, 80, 87, 74, 95, 81, 78, 86
]

median_math = statistics.median(math_scores)

print(f"数学成绩的中位数:{median_math}")
print(f"平均分(用于对比):{sum(math_scores) / len(math_scores):.2f}")

输出:

数学成绩的中位数:82.5
平均分(用于对比):82.00

分析:

  • 中位数为 82.5,说明有一半学生得分低于或等于 82.5,另一半高于或等于。
  • 平均分为 82.00,略低于中位数,说明可能有少数低分拉低了整体平均值。
  • 两者接近,说明成绩分布较均衡,没有严重偏态。

这个例子展示了 Python statistics.median() 方法在教育评估中的实用价值。


数据类型与边界情况处理

median() 方法支持多种数值类型,包括整数和浮点数。但必须确保输入的是可比较的数值,不能混入字符串或 None。

支持的数据类型

类型 是否支持 示例
整数 [1, 2, 3]
浮点数 [1.5, 2.7, 3.1]
混合类型 [1, 2.5, "3"](会报错)
import statistics

mixed_data = [1, 2.5, 3, 4.7, 5]

median_mixed = statistics.median(mixed_data)

print(f"混合数值的中位数:{median_mixed}")

输出:

混合数值的中位数:3.0

错误处理:空列表或非数值数据

import statistics

empty_list = []

try:
    statistics.median(empty_list)
except statistics.StatisticsError as e:
    print(f"错误:{e}")

输出:

错误:no median for empty data

📌 重要提醒:调用 median() 前应确保数据非空,否则会抛出异常。


与其他统计方法的对比:median vs mean

在数据分析中,中位数和平均数(mean)常被一起使用,以全面理解数据分布。

指标 优点 缺点 适用场景
平均数 计算简单,适合对称分布 易受极端值影响 数据分布均匀
中位数 抗干扰性强,反映中间水平 无法体现所有数据信息 存在异常值
import statistics

data_with_outlier = [10, 12, 14, 15, 16, 18, 20, 100]

print(f"原始数据:{data_with_outlier}")
print(f"平均数:{statistics.mean(data_with_outlier):.2f}")
print(f"中位数:{statistics.median(data_with_outlier)}")

输出:

原始数据:[10, 12, 14, 15, 16, 18, 20, 100]
平均数:23.75
中位数:15.5

结论: 平均数被 100 这个极端值拉高,而中位数仍保持在 15.5,更真实地反映了“大多数”数据的水平。


总结与建议

Python statistics.median() 方法 是一个简洁、高效、可靠的工具,特别适合处理真实世界中常出现的偏态数据。它不需要复杂的逻辑,却能提供比平均数更稳健的中间值参考。

  • 初学者:从简单的列表开始,逐步理解中位数的含义。
  • 中级开发者:在项目中用它来分析用户行为、收入分布、性能指标等。
  • 项目建议:在数据清洗后,优先使用中位数评估核心指标,避免被异常值误导。

掌握这个方法,是你迈向数据思维的重要一步。下次你看到一组数据时,不妨先问一句:中位数是多少?

Python 的 statistics 模块还有很多实用方法,如 mean()mode()stdev() 等,建议你后续继续探索,构建完整的统计分析能力。