You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

DataFrame百分位数计算:如何获取0至100分位的完整结果?

如何计算从0到100百分位的DataFrame数值百分位数

你提到的pandas.DataFrame.rank(pct=True)确实是计算百分位的常用方法,但它默认的计算逻辑是排名除以样本总数,所以对于4个样本的情况,第一个值的排名是1,1/4=0.25,就出现了你看到的结果。如果想要得到从0.0(最小)到1.0(最大)的百分位映射,可以用以下几种方法:

方法1:手动调整排名公式

最直接的方式是基于排名手动计算,公式为:(排名 - 1) / (样本总数 - 1)。这样最小的排名1会映射到0.0,最大的排名n会映射到1.0,中间值按线性比例分布。

示例代码:

import pandas as pd

num = pd.DataFrame([3,5,6,8])
# 获取排名(这里用method='min'处理重复值,可根据需求替换为'max'/'average'等)
rank_values = num.rank(method='min')
# 计算0到1的百分位
percentiles = (rank_values - 1) / (len(num) - 1)

print(percentiles)

输出结果:

0    0.000000
1    0.333333
2    0.666667
3    1.000000
dtype: float64

如果你的数据有重复值,method参数可以灵活调整:

  • method='min': 重复值取最小排名
  • method='max': 重复值取最大排名
  • method='average': 重复值取平均排名

方法2:使用scipy的percentileofscore(按需选择)

如果你需要基于“小于等于当前值的样本占比”来计算,但希望调整到0-1范围,可以用scipy.stats.percentileofscore,不过需要额外处理边界值:

from scipy.stats import percentileofscore
import pandas as pd

num = pd.DataFrame([3,5,6,8])
# 计算每个值的百分占比,再调整到0-1
percentiles = num.apply(
    lambda x: (percentileofscore(num[0], x, kind='weak') - 100/(len(num)*2)) / 100
)

print(percentiles)

不过这种方法相对复杂,对于简单的0-1线性映射,方法1是最优选择。

内容的提问来源于stack exchange,提问作者Skywalker

火山引擎 最新活动