Pandas Series.median() 函数
Series.median() 是 Pandas 中用于计算 Series 中位数(中间值)的函数。中位数是将数据排序后位于中间位置的值,它不受极端值影响,是描述数据集中趋势的稳健指标。
当数据中存在异常值或偏态分布时,中位数比平均值更能准确反映数据的中心位置。在收入数据分析、房价统计、成绩分析等场景中经常使用。
基本语法与参数
median() 是 Series 对象的成员函数,直接通过点运算符调用。
语法格式
Series.median(axis=None, skipna=True, level=None, numeric_only=None, **kwargs)
参数说明
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| axis | int | 指定轴向,Series 只有一行数据,此参数主要为了与 DataFrame 兼容。 | None |
| skipna | bool | 如果为 True,在计算时跳过 NaN 值;如果为 False,遇到 NaN 结果会返回 NaN。 | True |
| level | int 或 str | 如果 Series 是多层索引(MultiIndex),指定要计算的层级。 | None |
| numeric_only | bool | 如果为 True,只对数值型数据计算;否则会尝试转换为数值。 | False |
返回值
- 返回类型:
float - 说明:返回 Series 中所有元素的中位数。如果元素个数是偶数,返回中间两个元素的平均值。
实例
让我们通过一系列从简单到复杂的例子,彻底掌握 Series.median() 的用法。
示例 1:基础用法 - 奇数个元素的中位数
对于奇数个元素的数据,中位数就是排序后位于中间的那个值。
实例
import pandas as pd
# 创建一个包含员工收入的 Series
# 模拟一个部门 7 名员工的月收入(单位:千元)
income = pd.Series([5, 6, 7, 8, 9, 10, 50])
# 计算中位数
median_income = income.median()
print("员工月收入(千元):")
print(income)
print()
print(f"平均收入:{income.mean():.2f} 千元")
print(f"中位数收入:{median_income} 千元")
print()
print("注意:平均值受极端值(50 千元)影响较大,而中位数更能反映真实水平。")
# 创建一个包含员工收入的 Series
# 模拟一个部门 7 名员工的月收入(单位:千元)
income = pd.Series([5, 6, 7, 8, 9, 10, 50])
# 计算中位数
median_income = income.median()
print("员工月收入(千元):")
print(income)
print()
print(f"平均收入:{income.mean():.2f} 千元")
print(f"中位数收入:{median_income} 千元")
print()
print("注意:平均值受极端值(50 千元)影响较大,而中位数更能反映真实水平。")
运行结果:
员工月收入(千元): 0 5 1 6 2 7 3 8 4 9 5 10 6 50 dtype: int64 平均收入:13.57 千元 中位数收入:8.0 千元
代码解析:
- 数据排序后:[5, 6, 7, 8, 9, 10, 50]
- 中间位置是第 4 个元素(索引 3),值为 8。
- 由于有一个极端值(50),平均值(13.57)被拉高,而中位数(8)更能反映大多数人的收入水平。
示例 2:偶数个元素的中位数
对于偶数个元素的数据,中位数是中间两个元素的平均值。
实例
import pandas as pd
# 创建一个包含 6 个元素的 Series
# 模拟 6 名学生的考试成绩
scores = pd.Series([75, 82, 88, 92, 95, 100])
# 计算中位数
median_score = scores.median()
print("学生考试成绩:")
print(scores)
print()
print(f"平均成绩:{scores.mean():.2f}")
print(f"中位数成绩:{median_score}")
# 创建一个包含 6 个元素的 Series
# 模拟 6 名学生的考试成绩
scores = pd.Series([75, 82, 88, 92, 95, 100])
# 计算中位数
median_score = scores.median()
print("学生考试成绩:")
print(scores)
print()
print(f"平均成绩:{scores.mean():.2f}")
print(f"中位数成绩:{median_score}")
运行结果:
学生考试成绩: 0 75 1 82 2 88 3 92 4 95 5 100 dtype: int64 平均成绩:88.67 中位数成绩:90.0
代码解析:
- 数据排序后:[75, 82, 88, 92, 95, 100]
- 中间两个元素是 88 和 92(索引 2 和 3)。
- 中位数 = (88 + 92) / 2 = 90。
示例 3:处理包含缺失值的数据
skipna 参数决定了如何处理缺失值。
实例
import pandas as pd
import numpy as np
# 创建一个包含缺失值的 Series
data_with_nan = pd.Series([10, 20, np.nan, 30, 40, np.nan, 50])
print("包含缺失值的数据:")
print(data_with_nan)
print()
# 默认 skipna=True,跳过 NaN 计算中位数
median_skipna = data_with_nan.median()
print(f"skipna=True(默认)时的中位数:{median_skipna}")
# 设置 skipna=False
median_no_skipna = data_with_nan.median(skipna=False)
print(f"skipna=False 时的中位数:{median_no_skipna}")
import numpy as np
# 创建一个包含缺失值的 Series
data_with_nan = pd.Series([10, 20, np.nan, 30, 40, np.nan, 50])
print("包含缺失值的数据:")
print(data_with_nan)
print()
# 默认 skipna=True,跳过 NaN 计算中位数
median_skipna = data_with_nan.median()
print(f"skipna=True(默认)时的中位数:{median_skipna}")
# 设置 skipna=False
median_no_skipna = data_with_nan.median(skipna=False)
print(f"skipna=False 时的中位数:{median_no_skipna}")
运行结果:
包含缺失值的数据: 0 10.0 1 20.0 2 NaN 3 30.0 4 40.0 5 NaN 6 50.0 dtype: float64 skipna=True(默认)时的中位数:30.0 skipna=False 时的中位数:nan
代码解析:
- 有效数据:[10, 20, 30, 40, 50],共 5 个元素。
- 排序后取中间值:30。
skipna=False时,只要有 NaN 就返回 NaN。
示例 4:对比平均值和中位数的应用场景
展示中位数在处理偏态数据时的优势。
实例
import pandas as pd
# 模拟一个小区 10 户的月收入数据
# 大多数人收入在 3000-5000 元,但有少数高收入者
income_data = pd.Series([3000, 3500, 3800, 4000, 4200, 4500, 4800, 5000, 8000, 50000])
print("小区住户月收入数据(元):")
print(income_data)
print()
mean_income = income_data.mean()
median_income = income_data.median()
print(f"平均值:{mean_income:.2f} 元")
print(f"中位数:{median_income} 元")
print()
print("分析:")
print("平均值(10380 元)被极端值(50000 元)大幅拉高。")
print("中位数(4350 元)更能反映大多数住户的真实收入水平。")
print("这就是为什么统计部门在公布收入数据时更常用中位数。")
# 模拟一个小区 10 户的月收入数据
# 大多数人收入在 3000-5000 元,但有少数高收入者
income_data = pd.Series([3000, 3500, 3800, 4000, 4200, 4500, 4800, 5000, 8000, 50000])
print("小区住户月收入数据(元):")
print(income_data)
print()
mean_income = income_data.mean()
median_income = income_data.median()
print(f"平均值:{mean_income:.2f} 元")
print(f"中位数:{median_income} 元")
print()
print("分析:")
print("平均值(10380 元)被极端值(50000 元)大幅拉高。")
print("中位数(4350 元)更能反映大多数住户的真实收入水平。")
print("这就是为什么统计部门在公布收入数据时更常用中位数。")
运行结果:
小区住户月收入数据(元): 0 3000 1 3500 2 3800 3 4000 4 4200 5 4500 6 4800 7 5000 8 8000 9 50000 dtype: int64 平均值:10380.00 元 中位数:4350.0 元
注意事项
- 中位数对极端值不敏感,比平均值更稳健。
- 当数据量是偶数时,中位数是中间两个数的平均值。
- 在数据存在明显偏态分布时,中位数比平均值更能反映数据的中心位置。
skipna参数的行为与mean()相同。
小结
Series.median() 是描述数据集中趋势的重要函数。它的主要特点包括:
- 不受极端值影响,计算结果稳健。
- 对于偶数个元素,返回中间两个元素的平均值。
- 在收入、房价等存在偏态分布的数据分析中尤为有用。
- 语法和参数与
mean()完全相同,易于学习和使用。
在实际数据分析中,建议同时计算平均值和中位数,以便更全面地了解数据的分布特征。当两者差异较大时,说明数据可能存在偏态分布或异常值。

Pandas 常用函数