目录
进阶篇30. 数据排名与分位数 (rank, quantile)
在数据分析中,对数据进行排序和分位数计算是十分常见的操作。通过数据排名,我们可以得到各数据点在整个集合中的相对位置;而分位数则能将数据按照百分比分布划分为多个部分,用于描述数据分布的集中趋势和离散程度。Pandas 提供了两大方法来实现这些功能:
- rank():用于计算数据的排名。
- quantile():用于计算数据的分位数(百分位数)。
本文将详细介绍这两种方法的基本原理、参数设置、使用场景及其实际应用示例,并通过数学公式说明其核心概念。
1. 数据排名:rank()
1.1 基本概念
rank()
方法用于对数据进行排序,返回每个数据点在整体数据中的排名。假设有一组数据:
x
1
,
x
2
,
…
,
x
n
x_1, x_2, \dots, x_n
x1,x2,…,xn
通过 rank()
方法,可以计算每个 ( x_i ) 的排名 ( r_i ),其数学表达为:
r
i
=
rank
(
x
i
)
r_i = \text{rank}(x_i)
ri=rank(xi)
排名方法可以有不同的策略,例如:
- 平均排名(default):如果存在重复值,则取这些重复值的平均排名。
- 最小排名:重复值统一使用最小的那个排名。
- 最大排名:重复值统一使用最大的那个排名。
- 密集排名(dense):重复值后,下一个排名紧接着前一排名,不留空缺。
1.2 常用参数
rank()
方法常用的参数包括:
- method:指定排名方法,常用值有
'average'
(默认)、'min'
、'max'
、'dense'
、'first'
。 - na_option:如何处理缺失值,选项包括
'keep'
(保留 NaN)和'top'
或'bottom'
(分别将 NaN 排在最前或最后)。 - ascending:是否按升序排名,默认为 True;若设置为 False,则按降序排名。
1.3 示例代码
import pandas as pd
# 创建示例数据
data = {'Score': [88, 92, 85, 92, 76, 85, 95]}
df = pd.DataFrame(data)
# 计算排名(默认平均排名)
df['Rank_Avg'] = df['Score'].rank()
# 计算最小排名
df['Rank_Min'] = df['Score'].rank(method='min')
# 计算密集排名
df['Rank_Dense'] = df['Score'].rank(method='dense')
print("原始数据及排名:")
print(df)
输出示例:
Score Rank_Avg Rank_Min Rank_Dense
0 88 4.0 4.0 4.0
1 92 5.5 5.0 5.0
2 85 2.5 2.0 2.0
3 92 5.5 5.0 5.0
4 76 1.0 1.0 1.0
5 85 2.5 2.0 2.0
6 95 7.0 7.0 7.0
上述代码中,数据中有重复的分数(例如 92 分和 85 分),默认的平均排名对重复值取平均;而方法 'min'
则统一赋予最小排名;而 'dense'
则连续编号,不留空缺。
2. 分位数:quantile()
2.1 基本概念
分位数是统计数据中用于描述数据分布的一个重要指标。对于一个数据集合 ( X = {x_1, x_2, \dots, x_n} ),第 ( q ) 分位数 ( Q(q) ) 定义为满足:
P
(
X
≤
Q
(
q
)
)
≥
q
P(X \leq Q(q)) \geq q
P(X≤Q(q))≥q
其中 ( q ) 是一个介于 0 和 1 之间的数。例如,0.5 分位数(中位数)表示有 50% 的数据小于等于该值。
2.2 常用参数
在 Pandas 中,quantile()
方法可用于 Series 或 DataFrame,常用参数包括:
- q:一个浮点数或浮点数列表,表示要计算的分位点。例如,
q=0.5
表示中位数;q=[0.25, 0.5, 0.75]
表示四分位数。 - interpolation:在计算分位数时,若所需分位点不在数据中,则采用的插值方法。常见选项有
'linear'
(默认)、'lower'
、'higher'
、'nearest'
和'midpoint'
。
2.3 示例代码
import pandas as pd
import numpy as np
# 创建示例数据
data = np.array([10, 20, 30, 40, 50, 60, 70])
s = pd.Series(data)
# 计算中位数(0.5 分位数)
median_val = s.quantile(0.5)
print("中位数:", median_val)
# 计算 25% 和 75% 分位数
quantiles = s.quantile([0.25, 0.75])
print("25% 和 75% 分位数:")
print(quantiles)
输出示例:
中位数: 40.0
25% 和 75% 分位数:
0.25 25.0
0.75 55.0
dtype: float64
通过上述示例,可以看出 quantile() 方法根据数据分布返回指定分位点的数值。
3. 数据排名与分位数的应用场景
3.1 排名的应用
- 成绩排名:在考试成绩数据中,可以利用 rank() 方法对学生成绩进行排名,便于筛选 top N 学生或进行绩效评估。
- 排序与分类:在商业数据中,利用排名可以对客户、产品等进行排序,帮助制定分层营销策略。
- 异常值检测:通过比较排名与实际数值的关系,发现数据中的异常情况。
3.2 分位数的应用
- 分箱与离散化:利用 quantile() 计算分位数,可以将连续数据分箱(参见进阶篇23)。
- 描述统计:分位数能够反映数据的分布情况,如四分位数、百分位数等,是描述数据集中趋势和离散程度的重要指标。
- 风险管理:在金融领域,利用分位数计算 VaR(风险价值)等指标,评估投资风险。
例如,在股票收益率分析中,可以计算 5% 分位数作为潜在风险的衡量指标。
4. 性能与最佳实践
4.1 向量化与内置函数
Pandas 中的 rank() 和 quantile() 均基于向量化实现,性能非常高,因此在大数据集上直接调用不会有性能瓶颈。建议优先使用内置函数而非手写循环。
4.2 参数选择
- 在 rank() 方法中,选择合适的排名方法(method 参数)十分关键,需根据数据特点和需求选择
'average'
、'min'
、'dense'
等方法。 - 在 quantile() 方法中,选择合适的插值方法(interpolation 参数)可以确保分位数计算更符合预期。
4.3 数据清洗
确保数据在进行排名和分位数计算前已清洗干净,处理好缺失值。对于缺失值,可以使用 fillna()
或者在 ranking 时选择 na_option
参数。
5. 综合示例:考试成绩数据的排名与分位数分析
假设有一份考试成绩数据,我们希望对成绩进行排名,并计算各个分位数以便将成绩分为不同档次。
import pandas as pd
import numpy as np
# 模拟考试成绩数据
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva', 'Frank', 'Grace', 'Helen'],
'Score': [88, 92, 85, 92, 76, 85, 95, 80]
}
df = pd.DataFrame(data)
# 计算排名(默认平均排名)
df['Rank'] = df['Score'].rank(method='average', ascending=False)
# 计算分位数:25%, 50%, 75%
quantiles = df['Score'].quantile([0.25, 0.5, 0.75])
print("考试成绩数据:")
print(df)
print("\n分位数:")
print(quantiles)
在这个例子中,我们对成绩进行了排名(降序排列,分数越高排名越靠前),同时计算了成绩的 25%、50% 和 75% 分位数,为进一步将成绩分为不同档次提供了依据。例如,可以将低于 25% 分位数的成绩定义为“较差”,介于 25%-75% 之间为“中等”,高于 75% 为“优秀”。
6. 总结
本文详细介绍了 Pandas 中数据排名与分位数的两大核心功能:
- rank() 用于对数据进行排名。通过设置不同的参数(method、na_option、ascending),可以灵活调整排名方式,适用于各种排序、分层和异常值检测场景。
- quantile() 用于计算数据的分位数。分位数不仅能够描述数据的分布情况,还能作为数据分箱和风险评估的重要指标。数学表达分别为:
r i = rank ( x i ) r_i = \text{rank}(x_i) ri=rank(xi)
Q ( q ) = min { x ∣ P ( X ≤ x ) ≥ q } Q(q) = \min\{x \mid P(X \leq x) \geq q\} Q(q)=min{x∣P(X≤x)≥q}
通过多个示例和实际案例,你应该已经了解了如何利用 Pandas 快速对数据进行排名和分位数计算。无论是在考试成绩分析、金融风险管理,还是在商业数据排序中,这些工具都能够为数据分析提供重要支持。合理选择排名方法和分位数计算的参数,将帮助你更好地理解数据分布和相对位置,从而为后续的模型构建和决策制定打下坚实基础。
7. 参考资料
- Pandas 官方文档:DataFrame.rank citeturn1search0
- Pandas 官方文档:Series.quantile citeturn1search0
- 《Python for Data Analysis》 by Wes McKinney
希望本文能帮助你全面理解并灵活应用 Pandas 中的 rank() 和 quantile() 方法,在数据排序、分层和分位分析中做出更精确的决策。不断实践与探索,将使你在数据分析和建模过程中获得更高效、更准确的结果。