将列表按给定元素分组并计算平均值

时间:2020-09-29 13:04:31

标签: python list

如果具有以下列表:

l = [(('01001', '01003'), 4.15),
 (('01001', '01005'), 2.83),
 (('01001', '01007'), 3.32),
 (('01002', '01009'), 6.83),
 (('01002', '01011'), 2.53),
 (('01003', '01013'), 20.50),
 (('01003', '01013'), 20.50)]

我想为该列表的第一个元素(“ 01001”,“ 01002”和“ 01003”)计算平均值。

到目前为止,我的方法是将列表转换为数据框,然后将第一个括号分为两列,然后计算平均值。还有更Python化的方法吗?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

熊猫似乎对此过于矫over过正。由于这些要分组的值似乎是连续的(否则请使用字典),因此可以使用itertools.groupby并取这些浮点的平均值:

from itertools import groupby
from statistics import mean

[mean(v for *_, v in v) for k,v in groupby(l, lambda x: x[0][0])]
# [3.4333333333333336, 4.68, 20.5]

或者,如果您更喜欢字典:

{k:mean(v for *_, v in v) for k,v in groupby(l, lambda x: x[0][0])}
# {'01001': 3.4333333333333336, '01002': 4.68, '01003': 20.5}

答案 1 :(得分:0)

类似这样的东西:

from statistics import mean
l = [(('01001', '01003'), 4.15),
 (('01001', '01005'), 2.83),
 (('01001', '01007'), 3.32),
 (('01002', '01009'), 6.83),
 (('01002', '01011'), 2.53),
 (('01003', '01013'), 20.50),
 (('01003', '01013'), 20.50)]
 
print(mean(int(x[0][0]) for x in l))

输出

1001.8571428571429