Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从频率表计算百分位数?_Python_Numpy_Pandas_Statistics - Fatal编程技术网

Python 如何从频率表计算百分位数?

Python 如何从频率表计算百分位数?,python,numpy,pandas,statistics,Python,Numpy,Pandas,Statistics,我有一个CSV文件: fr id 1 10000152 1 10000212 1 10000847 1 10001018 2 10001052 2 10001246 14 10001908 ........... 这是一个频率表,id是整数变量,fr是给定值的出现次数。文件按值升序排序。 我想计算变量的百分位数(即90%,80%,70%…10%) 我在纯Python中完成了这项工作,类似于以下伪代码: bucket=sum(fr)/10.0 percentile=1 sum=0 f

我有一个CSV文件:

fr id
 1 10000152
 1 10000212
 1 10000847
 1 10001018
 2 10001052
 2 10001246
14 10001908
...........
这是一个频率表,
id
是整数变量,
fr
是给定值的出现次数。文件按值升序排序。 我想计算变量的百分位数(即90%,80%,70%…10%)

我在纯Python中完成了这项工作,类似于以下伪代码:

bucket=sum(fr)/10.0
percentile=1
sum=0
for (current_fr, current_id) in zip(fr,id):
   sum=sum+current_fr
   if (sum > percentile*bucket):
      print "%i percentile: %i" % (percentile*10,current_id)
      percentile=percentile+1
但这段代码非常原始:它没有考虑百分位应该在集合中的值之间,它不能后退,等等


还有更优雅、通用、现成的解决方案吗?

似乎您想要的是
fr
的累积总和。你能行

cumfr = [sum(fr[:i+1]) for i in range(len(fr))]
那么百分位数是

percentile = [100*i/cumfr[-1] for i in cumfr]

似乎您想要的是
fr
的累积和。你能行

cumfr = [sum(fr[:i+1]) for i in range(len(fr))]
那么百分位数是

percentile = [100*i/cumfr[-1] for i in cumfr]

这是一个很好的答案,但解释有限。如果能给出更好的解释,可能会帮助更多的人。此外,我无法将fr(:I+1)更正为fr[:I+1]。有权限更改少于6个字符的人可以进行更改吗?Python在运行代码时抛出的错误具有误导性。这是一个很好的答案,但解释有限。如果能给出更好的解释,可能会帮助更多的人。此外,我无法将fr(:I+1)更正为fr[:I+1]。有权限更改少于6个字符的人可以进行更改吗?Python在运行代码时抛出的错误具有误导性。