我有一个二维数组:
[[2,1],[2,32],[4,4512],[1,34],[2,323],[2,42],[1,23],[4,123]...]
最后,我想计算平均值并得到像 [ [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])
然后计算 temp
的平均值,但效率不高。
有没有人有使用pandas
库的解决方案?
最佳答案
您应该创建一个字典,收集每个键(第一项)的所有值(第二项)。然后,您可以计算字典中每个条目的平均值。
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()])
或者,您可以使用 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]))]
在这两种情况下,意味着
最终都是[(1, 28.5), (2, 99.5), (4, 2317.5)]
。复杂度应该是 O(nlogn)(对于排序;如果不需要排序后的输出,那么使用字典的第一种方法的复杂度只是 O(n) ).
就个人而言,我会选择字典方法。虽然另一个可以在“一行”中完成,但 dict 更清晰也更快(即使需要排序,因为在这种情况下排序是在合并之后完成的,即使用更少的元素)。
关于python - 计算重复平均 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35344622/