计算重复平均值python

Con*_*mer 2 python arrays python-2.7 pandas

我有一个二维数组:

 [[2,1],[2,32],[4,4512],[1,34],[2,323],[2,42],[1,23],[4,123]...]
Run Code Online (Sandbox Code Playgroud)

最后,我想计算平均值并得到数组,如 [ [1,mean],[2,mean],[3,mean]...],

有人有好的解决方案吗?我用了:

for i in range(len(array)):
    temp =[]
    for j in range(len(array)):
        if Table[i][0] == Table[j][0]:
                temp.append(Table[j])
Run Code Online (Sandbox Code Playgroud)

然后计算 的平均值temp,但效率不高。

有没有人有使用pandas库的解决方案?

tob*_*s_k 5

您应该创建一个字典,收集每个键(第一项)的所有值(第二项)。然后您可以计算字典中每个条目的平均值。

from __future__ import division # use floating-point division by default
values = [[2,1],[2,32],[4,4512],[1,34],[2,323],[2,42],[1,23],[4,123]]

values_by_key = collections.defaultdict(list)
for k, v in values:
    values_by_key[k].append(v)
means = sorted([(k, sum(v) / len(v)) for k, v in values_by_key.items()])
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用groupby相同的键对项目进行分组(记住先排序)并使用(有点复杂)嵌套列表理解。

means = [(k, sum(v)/len(v)) 
         for k, v in ((k, [v[1] for v in vals]) 
                      for k, vals in itertools.groupby(sorted(values), key=lambda t: t[0]))]
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,means最终都为[(1, 28.5), (2, 99.5), (4, 2317.5)]. 复杂性应该是O(nlogn)(对于排序;如果不需要排序的输出,则使用字典的第一种方法的复杂性仅为O(n))。

就我个人而言,我会采用字典方法。虽然另一个可以在“一行”中完成,但字典更清晰,也更快(即使需要排序,因为在这种情况下,排序是在合并后完成的,即元素更少)。