Bootstrap

Pandas使用教程 - 数据排名与分位数 (rank, quantile)

进阶篇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(XQ(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{xP(Xx)q}

通过多个示例和实际案例,你应该已经了解了如何利用 Pandas 快速对数据进行排名和分位数计算。无论是在考试成绩分析、金融风险管理,还是在商业数据排序中,这些工具都能够为数据分析提供重要支持。合理选择排名方法和分位数计算的参数,将帮助你更好地理解数据分布和相对位置,从而为后续的模型构建和决策制定打下坚实基础。


7. 参考资料

  • Pandas 官方文档:DataFrame.rank citeturn1search0
  • Pandas 官方文档:Series.quantile citeturn1search0
  • 《Python for Data Analysis》 by Wes McKinney

希望本文能帮助你全面理解并灵活应用 Pandas 中的 rank() 和 quantile() 方法,在数据排序、分层和分位分析中做出更精确的决策。不断实践与探索,将使你在数据分析和建模过程中获得更高效、更准确的结果。

;