Python 3.6。获取所有相同X坐标的Y平均值

4

我有一个坐标列表,长这样:

my_list = [[1, 1], [1, 3], [1, 5], [2, 1], [2, 3]]

如我们所见,前三个坐标的X值相同,但Y值不同,另外两个坐标也是相同的情况。我想创建一个新的列表,它将如下所示:

new_list = [[1, 3], [2, 2]]

其中 y1 = 3 = (1+3+5)/3y2 = 2 = (1+3)/2

我已经编写了下面的代码,但执行速度很慢。

我需要处理数十万个坐标,因此问题是:如何使这段代码运行更快?是否有任何优化或特殊的开源库可加快代码速度?

提前感谢你的帮助。

x_mass = []

for m in mass:
  x_mass.append(m[0])

set_x_mass = set(x_mass) 
list_x_mass = list(set_x_mass) 

performance_points = [] 

def function(i):
  unique_x_mass = []
  for m in mass:
    if m[0] == i:
      unique_x_mass.append(m)

  summ_y = 0
  for m in unique_x_mass:
    summ_y += m[1]
  point = [float(m[0]), float(summ_y/len(unique_x_mass))] 
  performance_points.append(point)
  return performance_points

for x in list_x_mass:
  function(x)

1
我非常好奇,我的解决方案在实际数据中是否更慢? - jezrael
2个回答

5
创建DataFrame并聚合mean:
L = [[1, 1], [1, 3], [1, 5], [2, 1], [2, 3]]

L1 = pd.DataFrame(L).groupby(0, as_index=False)[1].mean().values.tolist()
print (L1)
[[1, 3], [2, 2]]

4

@jezrael提供的pandas解决方案优雅但速度较慢(就像几乎所有的pandas一样)。我建议使用模块itertoolsstatistics

from statistics import mean
from itertools import groupby

grouper = groupby(L, key=lambda x: x[0])
#The next line is again more elegant, but slower:
#grouper = groupby(L, key=operator.itemgetter(0))
[[x, mean(yi[1] for yi in y)] for x,y in grouper]

结果当然是一样的。样本列表的执行时间比原来快了两个数量级


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接