Python 如何从频率表计算百分位数?
我有一个CSV文件: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
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在运行代码时抛出的错误具有误导性。