Pandas Series.quantile() 函数
Series.quantile() 是 Pandas 中用于计算 Series 分位数的函数。分位数是将有序数据分成若干等份的值,常用的有四分位数(25%、50%、75%)、中位数(50%)等。
分位数是描述数据分布的重要指标,可以帮助了解数据的分布形态、识别异常值。在统计分析、成绩排名、收入分析等场景中广泛应用。
基本语法与参数
quantile() 是 Series 对象的成员函数,直接通过点运算符调用。
语法格式
Series.quantile(q=0.5, interpolation='linear', numeric_only=True, closed='both')
参数说明
| 参数 | 类型 | 说明 | 默认值 |
|---|---|---|---|
| q | float 或 array-like | 分位数值,取值范围为 0 到 1。可以是单个值或多个值的列表。 | 0.5 |
| interpolation | str | 当分位数位于两个值之间时的插值方法。可选值:'linear'、'lower'、'higher'、'nearest'、'midpoint'。 | 'linear' |
| numeric_only | bool | 如果为 True,只对数值型数据计算。 | True |
| closed | str | 在 DataFrame 中使用,决定区间的闭合方式。Series 中不常用。 | 'both' |
返回值
- 返回类型:
float或Series - 说明:返回指定分位数的值。如果 q 是单个值,返回 float;如果 q 是列表,返回 Series。
实例
让我们通过一系列从简单到复杂的例子,彻底掌握 Series.quantile() 的用法。
示例 1:基础用法 - 计算中位数
中位数就是 50% 分位数,是最常用的分位数。
实例
import pandas as pd
# 创建一个包含学生成绩的 Series
scores = pd.Series([65, 70, 72, 75, 78, 80, 82, 85, 88, 90, 92, 95])
print("学生成绩:")
print(scores)
print()
# 计算中位数(50% 分位数)
median_score = scores.quantile(0.5)
print(f"中位数:{median_score}")
print(f"使用 median() 函数:{scores.median()}")
print()
print("分析:50% 的学生成绩低于或等于 80 分。")
# 创建一个包含学生成绩的 Series
scores = pd.Series([65, 70, 72, 75, 78, 80, 82, 85, 88, 90, 92, 95])
print("学生成绩:")
print(scores)
print()
# 计算中位数(50% 分位数)
median_score = scores.quantile(0.5)
print(f"中位数:{median_score}")
print(f"使用 median() 函数:{scores.median()}")
print()
print("分析:50% 的学生成绩低于或等于 80 分。")
运行结果:
学生成绩: 0 65 1 70 2 72 3 75 4 75 5 80 6 80 7 85 8 88 9 90 10 92 11 95 dtype: int64 中位数:80.0 中位数(使用 median() 函数):80.0
代码解析:
quantile(0.5)等同于median()。- 中位数将数据分成两半,50% 的数据小于等于中位数。
示例 2:计算四分位数
四分位数将数据分成四等份:25%、50%、75%。
实例
import pandas as pd
# 创建一个包含员工收入的 Series
income = pd.Series([3000, 3500, 3800, 4000, 4200, 4500, 5000, 5500, 6000, 8000, 15000])
print("员工月收入数据(元):")
print(income)
print()
# 计算三个四分位数
q1 = income.quantile(0.25) # 第一四分位数(25%)
q2 = income.quantile(0.50) # 第二四分位数/中位数(50%)
q3 = income.quantile(0.75) # 第三四分位数(75%)
print(f"第一四分位数 Q1(25%):{q1} 元")
print(f"第二四分位数 Q2(50%):{q2} 元")
print(f"第三四分位数 Q3(75%):{q3} 元")
print()
# 计算四分位距(IQR)
iqr = q3 - q1
print(f"四分位距 IQR:{iqr} 元")
print()
print("分析:")
print("- 25% 的员工收入低于或等于 4000 元")
print("- 50% 的员工收入低于或等于 5000 元")
print("- 75% 的员工收入低于或等于 6000 元")
print("- IQR 越大,说明数据越分散")
# 创建一个包含员工收入的 Series
income = pd.Series([3000, 3500, 3800, 4000, 4200, 4500, 5000, 5500, 6000, 8000, 15000])
print("员工月收入数据(元):")
print(income)
print()
# 计算三个四分位数
q1 = income.quantile(0.25) # 第一四分位数(25%)
q2 = income.quantile(0.50) # 第二四分位数/中位数(50%)
q3 = income.quantile(0.75) # 第三四分位数(75%)
print(f"第一四分位数 Q1(25%):{q1} 元")
print(f"第二四分位数 Q2(50%):{q2} 元")
print(f"第三四分位数 Q3(75%):{q3} 元")
print()
# 计算四分位距(IQR)
iqr = q3 - q1
print(f"四分位距 IQR:{iqr} 元")
print()
print("分析:")
print("- 25% 的员工收入低于或等于 4000 元")
print("- 50% 的员工收入低于或等于 5000 元")
print("- 75% 的员工收入低于或等于 6000 元")
print("- IQR 越大,说明数据越分散")
运行结果:
员工月收入数据(元): 1 3000 2 低于 3800 3 4000 4 4200 5 4500 6 5000 7 5500 8 6000 9 8000 10 15000 dtype: int64 Q1(25% 分位):4000.0 元 Q2(50% 分位):5000.0 元 Q3(75% 分位):6000.0 元 四分位距 IQR = 6000 - 4000 = 2000 元
示例 3:同时计算多个分位数
可以一次性计算多个分位数。
实例
import pandas as pd
# 创建数据
data = pd.Series([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
print("数据:")
print(data)
print()
# 计算多个分位数
percentiles = data.quantile([0, 0.1, 0.25, 0.5, 0.75, 0.9, 1.0])
print("各分位数:")
print(percentiles)
print()
# 分位数也可以用百分比字符串(仅限单个值)
print(f"使用字符串 '50%':{data.quantile('50%')}")
print(f"使用字符串 '0.5':{data.quantile(0.5)}")
# 创建数据
data = pd.Series([10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
print("数据:")
print(data)
print()
# 计算多个分位数
percentiles = data.quantile([0, 0.1, 0.25, 0.5, 0.75, 0.9, 1.0])
print("各分位数:")
print(percentiles)
print()
# 分位数也可以用百分比字符串(仅限单个值)
print(f"使用字符串 '50%':{data.quantile('50%')}")
print(f"使用字符串 '0.5':{data.quantile(0.5)}")
运行结果:
数据: 0 10 1 20 2 30 3 40 4 50 量值:60 5 70 6 80 7 90 8 100 dtype: int 参数 多个分位数: 0.00 10.0 0.10 19.0 0.25 32.5 0.50 50.0 0.75 67.5 0.90 81.0 1.00 100.0 dtype: float64
示例 4:interpolation 参数的作用
当分位数位于两个值之间时,不同的插值方法会得到不同的结果。
实例
import pandas as pd
# 创建一个包含 6 个元素的 Series
data = pd.Series([10, 20, 30, 40, 50, 60])
print("数据:", data.values)
print()
# 计算 30% 分位数(位于 20 和 30 之间)
# 位置 = (n-1) * q = 5 * 0.3 = 1.5
print("30% 分位数,使用不同插值方法:")
linear = data.quantile(0.3, interpolation='linear')
print(f"linear(线性插值,默认): {linear}")
lower = data.quantile(0.3, interpolation='lower')
print(f"lower(取较小值): {lower}")
higher = data.quantile(0.3, interpolation='higher')
print(f"higher(取较大值): {higher}")
nearest = data.quantile(0.3, interpolation='nearest')
print(f"nearest(取最近值): {nearest}")
midpoint = data.quantile(0.3, interpolation='midpoint')
print(f"midpoint(取中间值): {midpoint}")
# 创建一个包含 6 个元素的 Series
data = pd.Series([10, 20, 30, 40, 50, 60])
print("数据:", data.values)
print()
# 计算 30% 分位数(位于 20 和 30 之间)
# 位置 = (n-1) * q = 5 * 0.3 = 1.5
print("30% 分位数,使用不同插值方法:")
linear = data.quantile(0.3, interpolation='linear')
print(f"linear(线性插值,默认): {linear}")
lower = data.quantile(0.3, interpolation='lower')
print(f"lower(取较小值): {lower}")
higher = data.quantile(0.3, interpolation='higher')
print(f"higher(取较大值): {higher}")
nearest = data.quantile(0.3, interpolation='nearest')
print(f"nearest(取最近值): {nearest}")
midpoint = data.quantile(0.3, interpolation='midpoint')
print(f"midpoint(取中间值): {midpoint}")
运行结果:
数据:[10, 20, 30, 40, 50, 60] 位置计算:(n-1) * q = 5 * 0.3 = 1.5,表示在 20 和 30 之间 不同插值方法的结果: - linear(线性插值,默认):23.0 - lower(向下取整):20.0 - higher(向上取整):30.0 - nearest(最近邻):20.0 - midpoint(中间值):25.0
代码解析:
interpolation='linear':在两个值之间进行线性插值,20 + (30-20)*0.5 = 23。interpolation='lower':取索引较小的值,即 20。interpolation='higher':取索引较大的值,即 30。interpolation='nearest':取距离分位数位置最近的值。interpolation='midpoint':取两个值的中间值,即 (20+30)/2 = 25。
示例 5:使用分位数识别异常值
四分位距(IQR)常用于识别数据中的异常值。
实例
import pandas as pd
# 创建一个包含一些异常值的数据
data = pd.Series([12, 15, 18, 20, 22, 25, 28, 30, 32, 150])
print("数据(含异常值):")
print(data)
print()
# 计算四分位数
q1 = data.quantile(0.25)
q3 = data.quantile(0.75)
iqr = q3 - q1
# 计算异常值边界
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
print(f"Q1(25%):{q1}")
print(f"Q3(75%):{q3}")
print(f"IQR:{iqr}")
print()
print(f"正常值下界:{lower_bound}")
print(f"正常值上界:{upper_bound}")
print()
# 识别异常值
outliers = data[(data upper_bound)]
print(f"异常值:{outliers.values}")
print()
print("分析:150 是一个明显的异常值,超出了上界。")
# 创建一个包含一些异常值的数据
data = pd.Series([12, 15, 18, 20, 22, 25, 28, 30, 32, 150])
print("数据(含异常值):")
print(data)
print()
# 计算四分位数
q1 = data.quantile(0.25)
q3 = data.quantile(0.75)
iqr = q3 - q1
# 计算异常值边界
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
print(f"Q1(25%):{q1}")
print(f"Q3(75%):{q3}")
print(f"IQR:{iqr}")
print()
print(f"正常值下界:{lower_bound}")
print(f"正常值上界:{upper_bound}")
print()
# 识别异常值
outliers = data[(data upper_bound)]
print(f"异常值:{outliers.values}")
print()
print("分析:150 是一个明显的异常值,超出了上界。")
运行结果:
数据(含异常值): 3 150 4 22 5 25 6 28 7 30 8 32 9 150 dtype: int64 Q1(25%):18.75 Q3(75%):30.25 IQR = 11.5 正常值下界:1.5 正常值上界:47.5 异常值:150 分析:150 明显超出了正常范围,是一个异常值。
注意事项
- 分位数的取值范围是 0 到 1。
- 默认使用线性插值(linear)方法计算分位数。
- 当 q 是列表时,返回值是 Series,而不是单个值。
- 分位数可以用于识别数据中的异常值,常用的方法是 IQR 法则(1.5 倍四分位距)。
- 对于大量数据,分位数的计算效率很高。
小结
Series.quantile() 是分析数据分布的重要函数。它的主要特点包括:
- 支持计算任意分位数(0 到 1 之间)。
- 可以一次性计算多个分位数。
- 提供多种插值方法,满足不同需求。
- 在识别异常值方面非常有用。
在实际数据分析中,分位数常用于了解数据的分布形态、比较不同数据集、识别异常值等。配合箱线图使用,可以更直观地展示数据分布。

Pandas 常用函数