【问题标题】:ranking tuples with ties对有关系的元组进行排名
【发布时间】:2013-10-18 22:36:53
【问题描述】:

我正在编写 Wilcoxon rank-sums 测试的扩展,这要求我先编写此测试的基本功能。这也意味着我不能使用 SciPy 进行此练习。

我在那里有基本的骨架代码,但我无法平均平局的等级。这是我的代码:

#read in data
m1 = [0,0,0,0,0,2,3,3,3,4,4,5,6,10,10,10,11,12,15,15,15,20,22,25,25,27,30]
w1 = [0,0,0,0,0,0,1,3,3,3,3,7,8,8,19,20,27,30]

#convert to tuples, incl where they came from
m1t = []
for m in m1:
    m1t.append((m, "m1"))
w1t = []
for w in w1:
    w1t.append((w, "w1"))

all1t = m1t + w1t #combine

all1ts = sorted(all1t, key=lambda tup: tup[0]) #sort

all1tsr = [row+(i,) for i,row in enumerate(all1ts,0)] #rank

#revert to back to original grouping
m1r = [i for i in all1tsr if i[1]=="m1"]
w1r = [i for i in all1tsr if i[1]=="w1"]

这是当前的输出:

>>> all1tsr[:15]
[(0, 'm1', 0),
 (0, 'm1', 1),
 (0, 'm1', 2),
 (0, 'm1', 3),
 (0, 'm1', 4),
 (0, 'w1', 5),
 (0, 'w1', 6),
 (0, 'w1', 7),
 (0, 'w1', 8),
 (0, 'w1', 9),
 (0, 'w1', 10),
 (1, 'w1', 11),
 (2, 'm1', 12),
 (3, 'm1', 13),
 (3, 'm1', 14)]

每个元组的元素 1 是它们排序的值,元素 2 只是一个标识符,元素 3 是按元素 1 排序时的排名。有 10 个观察值以“0”作为元素 1,现在他们都被分配了升序,但我想以某种方式平均这些排名(分配所有排名为 5)。

换句话说,我想要这个:

[(0, 'm1', 5),
 (0, 'm1', 5),
 (0, 'm1', 5),
 (0, 'm1', 5),
 (0, 'm1', 5),
 (0, 'w1', 5),
 (0, 'w1', 5),
 (0, 'w1', 5),
 (0, 'w1', 5),
 (0, 'w1', 5),
 (0, 'w1', 5),
 (1, 'w1', 11),
 (2, 'm1', 12),
 (3, 'm1', 13.5),
 (3, 'm1', 13.5)]

欢迎所有反馈,谢谢

【问题讨论】:

    标签: python list tuples tie


    【解决方案1】:

    首先,我将以更短的方式获得all1ts

    import itertools
    
    all1ts = sorted(itertools.chain(((m, "m1") for m in m1),
                                    ((w, "w1") for w in w1)))
    
    all1tsr = [row+(i,) for i,row in enumerate(all1ts)]
    

    那我就用itertools.groupby,基本上就是为了做这样的事情而设计的。

    groups = []
    for _, group in itertools.groupby(all1tsr, lambda x: x[0]):
      group = list(group)
      rank = sum(x[2] for x in group) / len(group)
      groups.extend((val, identifier, rank) for val, identifier, _ in group)
    

    在你的测试数据上运行给了我这个结果:

    [(0, 'm1', 5),
     (0, 'm1', 5),
     (0, 'm1', 5),
     (0, 'm1', 5),
     (0, 'm1', 5),
     (0, 'w1', 5),
     (0, 'w1', 5),
     (0, 'w1', 5),
     (0, 'w1', 5),
     (0, 'w1', 5),
     (0, 'w1', 5),
     (1, 'w1', 11),
     (2, 'm1', 12),
     (3, 'm1', 16),
     (3, 'm1', 16),
     (3, 'm1', 16),
     (3, 'w1', 16),
     (3, 'w1', 16),
     (3, 'w1', 16),
     (3, 'w1', 16),
     (4, 'm1', 20),
     (4, 'm1', 20),
     (5, 'm1', 22),
     (6, 'm1', 23),
     (7, 'w1', 24),
     (8, 'w1', 25),
     (8, 'w1', 25),
     (10, 'm1', 28),
     (10, 'm1', 28),
     (10, 'm1', 28),
     (11, 'm1', 30),
     (12, 'm1', 31),
     (15, 'm1', 33),
     (15, 'm1', 33),
     (15, 'm1', 33),
     (19, 'w1', 35),
     (20, 'm1', 36),
     (20, 'w1', 36),
     (22, 'm1', 38),
     (25, 'm1', 39),
     (25, 'm1', 39),
     (27, 'm1', 41),
     (27, 'w1', 41),
     (30, 'm1', 43),
     (30, 'w1', 43)]
    

    我认为这就是你想要的。

    【讨论】:

    • 这就是我所追求的,谢谢。我需要更多地了解这种你称之为“itertools”的魔法。
    • 这是非常棒的魔法。 :-) 如果这是您所追求的,您能否将此答案标记为已接受?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2018-06-03
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    相关资源
    最近更新 更多