找出价值的百分位数

时间:2018-05-17 08:39:39

标签: python

我有一组像[1,2,3,4,5]这样的值,我需要找到每个值的百分位数。我期待的输出类似于[0,25,50,75,100]

我在numpy中搜索了一个可以获得所需结果的API并找到了np.percentile,但它恰恰相反。给定百分位值,它将使用输入列表作为分布找到一个值。

是否有api或方法来获取此信息?感谢

6 个答案:

答案 0 :(得分:1)

您应该使用list comprehension将每个列表值划分为max(lst) -1

lst = [1,2,3,4,5]
max_val = max(lst) -1
lst = [(elem-1)/max_val * 100 for elem in lst]
print(lst)

输出

[0.0, 25.0, 50.0, 75.0, 100.0]

您也可以使用numpy数组来实现此目的。

arr = np.array([1,2,3,4,5])
result = (arr - 1) / (np.max(arr) - 1) * 100

答案 1 :(得分:1)

使用偏移量获得0表示1值,计算最大值,减去1,对其他值执行相同操作,计算列表理解中的百分比:

lst = [1,2,3,4,5]
maxval = max(lst)-1
newlst = [(v-1)*100/maxval for v in lst]

print(newlst)

结果(作为浮点数,如果你需要整数使用//进行除法)

[0.0, 25.0, 50.0, 75.0, 100.0]

答案 2 :(得分:1)

我将百分位数的定义(来自维基百科)视为

  

通常在文本中给出的百分位数的一个定义是N个有序值列表的第P个百分位数(0

因此,对于您的数据,答案是:

[20,40,60,80,100]

我还假设你没有统一的分布,而且数字可以重复。你可以使用字典来查找结果:

nbr = [1,1,3,4,5]
sorted_nbr = sorted(nbr)
ans = {x: 100*(1+i)/len(sorted_nbr) for i,x in enumerate(sorted_nbr)}

这个产量:

{1: 40.0, 3: 60.0, 4: 80.0, 5: 100.0}

如果您需要列表,请使用:

[ans[x] for x in nbr]

答案 3 :(得分:0)

如果您的输入可以包含要映射到0% - 100%的任意数字(例如[3, 7, 13, 20]),那么您需要确定最小数量和最大数量并将值拉伸到0 ... 100:

vs = [ 3, 7, 13, 20 ]
min_vs = min(vs)
max_vs = max(vs)
for v in vs:
  fraction = float(v - min_vs) / (max_vs - min_vs)
  percentage = fraction * 100
  print(percentage)

答案 4 :(得分:0)

要获取给定数据集中值的百分位数,请使用 scipy's percentileofscore

from scipy.stats import percentileofscore

dataset = [1,2,3,4,5]

percentile_of_3 = percentileofscore(dataset, 3)
print(percentile_of_3)

[Output] 60.0

此输出意味着数据集中 60% 的值小于或等于 3。 percentileofscore 的“kind”参数可用于指定百分位数的截止值是包含还是不包含。例如:

percentile_of_3 = percentileofscore(dataset, 3)
print(percentile_of_3)

[Output] 40.0

表示数据集中 40% 的值小于 3。

如果我们想要一个包含每个值的百分位数的列表,我们可以使用列表理解:

all_percentiles = [percentileofscore(dataset, value, kind='strict') for value in dataset]

[Output] [0.0, 20.0, 40.0, 60.0, 80.0]

答案 5 :(得分:0)

您应该使用 np.true_divide

x = np.arange(5)
np.true_divide(x, 4)*100
[Output] array([ 0.  ,  25.,  50. ,  75.,  100.  ])