从python中的数据点映射线性排名

时间:2014-11-13 18:06:13

标签: python python-2.7 csv mapping

我有一个csv加载到行中作为更大列表中的列表 - 大约500,000个。行/子列表中的一个项目是分数。这个得分是一个从0到1不等的浮点数。这些得分恰好分散在一个非常不平衡的方式,我想要将它们的分布正常化。我不需要像钟形曲线那样棘手的任何事情,只需要从1到0的等级进行均匀的步骤,并且以任何方式分层的分数(大数不重要)。我也喜欢按分数降序排序的结果。

示例列表作为起点:

list1 = [
    ['item1', 0.955, 'asdcwe', 'adcwett'],
    ['item2', 0.111, 'awioe', 'ocijwe'],
    ['item3', 0.111, 'dcuwq0eu', 'a9dfuwe'],
    ['item4', 0.5, 'aosdic', '204523'],
    ['item5', 1.0, 'oooo', 'ffff'],
    ['item6', 0.112, '03423', 'aewcew']]

示例结果:

sortedlist = [
    ['item5', 1.0, 'oooo', 'ffff'],
    ['item1', 0.8, 'asdcwe', 'adcwett'],
    ['item4', 0.6, 'aosdic', '204523'],
    ['item6', 0.4, '03423', 'aewcew'],
    ['item2', 0.2, 'awioe', 'ocijwe'],
    ['item3', 0.0, 'dcuwq0eu', 'a9dfuwe']]

(对我来说不重要的细节:最小/最大可能是包容性的或排他性的,因此在这种情况下得分可能会产生0.143-0.857。另外,如果第2项和第3项,并列,最终在结果中翻了一遍,也没问题。)

1 个答案:

答案 0 :(得分:1)

最简单的方法是排序,然后标准化:

step = 1.0 / (len(list1) - 1)
sortedlist = [l[:1] + [(len(list1) - i - 1) * step] + l[2:] 
             for i, l in enumerate(sorted(list1, key=lambda item: item[1], reverse=True))]

演示:

>>> list1 = [
...     ['item1', 0.955, 'asdcwe', 'adcwett'],
...     ['item2', 0.111, 'awioe', 'ocijwe'],
...     ['item3', 0.111, 'dcuwq0eu', 'a9dfuwe'],
...     ['item4', 0.5, 'aosdic', '204523'],
...     ['item5', 1.0, 'oooo', 'ffff'],
...     ['item6', 0.112, '03423', 'aewcew']]
>>> step = 1.0 / (len(list1) - 1)
>>> sortedlist = [l[:1] + [(len(list1) - i - 1) * step] + l[2:] 
...              for i, l in enumerate(sorted(list1, key=lambda item: item[1], reverse=True))]
>>> pprint(sortedlist)
[['item5', 1.0, 'oooo', 'ffff'],
 ['item1', 0.8, 'asdcwe', 'adcwett'],
 ['item4', 0.6000000000000001, 'aosdic', '204523'],
 ['item6', 0.4, '03423', 'aewcew'],
 ['item2', 0.2, 'awioe', 'ocijwe'],
 ['item3', 0.0, 'dcuwq0eu', 'a9dfuwe']]