我有一组像[1,2,3,4,5]
这样的值,我需要找到每个值的百分位数。我期待的输出类似于[0,25,50,75,100]
。
我在numpy中搜索了一个可以获得所需结果的API并找到了np.percentile
,但它恰恰相反。给定百分位值,它将使用输入列表作为分布找到一个值。
是否有api或方法来获取此信息?感谢
答案 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. ])