计算列中值的百分位数

问题描述 投票:0回答:5

我有一个数据框,其中有一列包含数值。此列不能很好地近似正态分布。给定另一个不在本列中的数值,我如何计算其在该列中的百分位数?也就是说,如果该值大于列中值的 80% 但小于其他 20%,则它将位于第 20 个百分位数。

python pandas statistics distribution
5个回答
44
投票

要查找值相对于数组(或者在您的情况下是数据框列)的百分位,请使用 scipy 函数

stats.percentileofscore()

例如,如果我们有一个值

x
(不在数据框中的另一个数值)和一个参考数组
arr
(数据框中的列),我们可以通过以下方式找到
x
的百分位数:

from scipy import stats
percentile = stats.percentileofscore(arr, x)

请注意,

stats.percentileofscore()
函数的第三个参数对百分位数的结果值有重大影响,即。
kind
。您可以选择
rank
weak
strict
mean
。请参阅文档了解更多信息。

有关差异的示例:

>>> df
   a
0  1
1  2
2  3
3  4
4  5

>>> stats.percentileofscore(df['a'], 4, kind='rank')
80.0

>>> stats.percentileofscore(df['a'], 4, kind='weak')
80.0

>>> stats.percentileofscore(df['a'], 4, kind='strict')
60.0

>>> stats.percentileofscore(df['a'], 4, kind='mean')
70.0

最后一点,如果您的值大于列中其他值的 80%,则该值将位于第 80 个百分位数(请参阅上面的示例,了解

kind
方法如何在一定程度上影响最终分数)不是第 20 个百分位数。请参阅这篇维基百科文章了解更多信息。


5
投票

可能很晚了,但仍然

df['column_name'].describe()

将为您提供常规的 25、50 和 75 百分位数以及一些附加数据 但如果您想要某些特定值的百分位数那么

df['column_name'].describe(percentiles=[0.1, 0.2, 0.3, 0.5])

这将为您提供第 10 个、第 20 个、第 30 个和第 50 个百分位数。 您可以提供任意多个值。

生成的对象可以像字典一样访问:

desc = df['column_name'].describe(percentiles=[0.1, 0.2, 0.3, 0.5])
print(desc)
print(desc['10%'])

3
投票

由于您正在寻找高于/低于特定阈值的值,因此您可以考虑使用 pandas qcut 函数。如果您想要低于 20% 和高于 80% 的值,请将数据分为 5 个大小相等的分区。每个分区代表相同大小的 20%“块”(五个 20% 分区就是 100%)。因此,给定一个包含 1 列“a”的 DataFrame,它代表您拥有数据的列:

df['newcol'] = pd.qcut(df['a'], 5, labels=False)

这将为您的 DataFrame 提供一个新列,每行都有一个值 (0, 1, 2, 3, 4)。其中 0 代表最低的 20%,4 代表最高的 20%,即 80% 的百分位。


1
投票

对列进行排序,然后查看该值是否位于前 20% 或任何百分位内。

例如:

def in_percentile(my_series, val, perc=0.2): 
    myList=sorted(my_series.values.tolist())
    l=len(myList)
    return val>myList[int(l*perc)]

或者,如果您想要实际的百分位数,只需使用

searchsorted
:

my_series.values.searchsorted(val)/len(my_series)*100

0
投票

答案是将百分位数除以 100,称为分位数:

result = my_series.quantile(0.8)
© www.soinside.com 2019 - 2024. All rights reserved.