元组列表中具有相同索引的所有元素的平均值

DOR*_*pst 3 python numpy average pandas

我有一个非常奇怪的数据结构,它是一个元组列表。每个元组有五个元素,其中第一个是标识字符串,其他四个是浮点数字符串(很奇怪,它们不仅仅是浮点数)。抱歉,我从其他人那里得到了这些数据。

我想平均第一个索引相同的 2-5 个数字的所有数字。例子:

   [('ch', ' 0.8307', '0.8583', '0.8047', ' 0.969'),
    ('de', ' 0.721', '0.7529', '0.6917', ' 0.968'),
    ('en', ' 0.8441', '0.8732', '0.8168', ' 0.9569'),
    ('fn', ' 0.8207', '0.8574', '0.7870', ' 0.9609'),
    ('ch', ' 0.466', '0.572', '0.7733', ' 0.969'),
    ('de', ' 0.322', '0.385', '0.5431', ' 0.968'),
    ('sp', ' 0.7609', '0.7893', '0.7344', ' 0.9663'),
    ('ti', ' 0.8135', '0.8430', '0.7860', ' 0.9662')]
Run Code Online (Sandbox Code Playgroud)

输出应该只是将具有相同第一个索引的所有元素一起缩小并平均它们的值,所以它会是这样的(我没有在我的示例输出中对值进行平均):

   [('ch', ' 0.8307', '0.8583', '0.8047', ' 0.969'),
    ('de', ' 0.721', '0.7529', '0.6917', ' 0.968'),
    ('en', ' 0.8441', '0.8732', '0.8168', ' 0.9569'),
    ('fn', ' 0.8207', '0.8574', '0.7870', ' 0.9609'),
    ('sp', ' 0.7609', '0.7893', '0.7344', ' 0.9663'),
    ('ti', ' 0.8135', '0.8430', '0.7860', ' 0.9662')]
Run Code Online (Sandbox Code Playgroud)

有什么我可以在这里做的非常聪明的事情,而不是制作一个巨大的 for 循环来提取所有内容?

Thi*_*lle 5

您可以先创建一个 dict 来收集与每个 id 相关的所有值,然后计算均值:

from collections import defaultdict

data = [('ch', ' 0.8307', '0.8583', '0.8047', ' 0.969'),
('de', ' 0.721', '0.7529', '0.6917', ' 0.968'),
('en', ' 0.8441', '0.8732', '0.8168', ' 0.9569'),
('fn', ' 0.8207', '0.8574', '0.7870', ' 0.9609'),
('ch', ' 0.466', '0.572', '0.7733', ' 0.969'),
('de', ' 0.322', '0.385', '0.5431', ' 0.968'),
('sp', ' 0.7609', '0.7893', '0.7344', ' 0.9663'),
('ti', ' 0.8135', '0.8430', '0.7860', ' 0.9662')]

def mean(lst):
    return sum(lst)/len(lst)

d = defaultdict(list)
for id, *values in data:
    d[id].append(list(map(float, values)))

    
    
out = {id: [mean(column) for column in zip(*values)] for id, values in d.items() }
    
    
print(out)

    # {'ch': [0.64835, 0.71515, 0.7889999999999999, 0.969], 
    #  'de': [0.5215, 0.5689500000000001, 0.6174, 0.968],
    #  'en': [0.8441, 0.8732, 0.8168, 0.9569], 
    #  'fn': [0.8207, 0.8574, 0.787, 0.9609], 
    #  'sp': [0.7609, 0.7893, 0.7344, 0.9663], 
    #  'ti': [0.8135, 0.843, 0.786, 0.9662]}
Run Code Online (Sandbox Code Playgroud)

在 中for id, *values in data:,我们迭代 的元组data,并将元组的第一项放入id,其余值放入values

此外,使用 adefaultdict(list)允许我们简单地为每个键附加新的值列表,因为如果列表尚不存在,则会自动创建一个空列表。