python - 对于列表中的每个不同数字,计算数字后面的数字的平均值。 (是的,很难理解)

我有以下随机数字列表:

numbers = [1, 3, 5, 5, 2, 4, 1, 5, 4, 5, 2, 2]

对于每个数字(1、2、3、4、5),我想知道它后面的数字的平均值。

下面是一个示例:

1 在列表中的位置 0 和 6 出现了两次。

在第 0 位,紧随其后的是数字 3(在第 1 位),在第 6 位,紧随其后的是数字 5(在第 7 位)。

所以 1出现两次,紧接着是 3 和 5。

3 和 5 的均值是 4,(3+5)/2 = 4.0

所以 1 的结果是4.

对 2 使用相同的方法:

在位置 4、10 和 11 找到 2,然后是 4 和 2。列表末尾的最后一个 2 被丢弃,因为它后面没有任何内容。

所以 2 的结果是 (4+2)/2 = 3.0

如果我继续使用这种方法并将结果作为字典呈现,我会得到这个。

results = {
  1: 4.0,
  2: 3.0,
  3: 5.0,   # 5/1
  4: 3.0,   # (1+5)/2
  5: 3.25,  # (5+2+4+2)/4
}

我需要以一种有效的方式自动化这个过程,因为它应该在很长的列表上运行。

我想使用 pandas 或 numpy 来解决这个问题,但我是这些包的初学者.

我当然正在阅读文档,但它们太长了,我觉得我会在两年内找到解决方案 :D

任何帮助、快捷方式或指向右侧的链接部分文档将不胜感激。

结果不必是字典。它可以是任何东西,例如一个新的数据帧,只要计算是高效的,并且如果可能的话是优雅的。

谢谢你的时间 !

回答1

如何使用 collections.defaultdictzip(或 python 3.10+ 的 itertools.pairwise):

from collections import defaultdict

numbers = [1, 3, 5, 5, 2, 4, 1, 5, 4, 5, 2, 2]

dct = defaultdict(list)
for x, y in zip(numbers, numbers[1:]):
# (Alternatively, on python 3.10+) for x, y in itertools.pairwise(numbers):
    dct[x].append(y)

dct = {k: sum(lst) / len(lst) for k, lst in dct.items()}
print(dct)
# {1: 4.0, 3: 5.0, 5: 3.25, 2: 3.0, 4: 3.0}

回答2

Pandas 方法

s = pd.Series(numbers)
s.shift(-1).groupby(s).mean().to_dict()
{1: 4.0, 2: 3.0, 3: 5.0, 4: 3.0, 5: 3.25}

相似文章

scala - 多个列表的组合 (Scala)

我正在尝试编写一个函数,该函数将多个列表作为输入并返回这些列表之间每个组合的字符串表示形式。样本输入:valintegers=List(1,2,3,4)valcharacters=List('a','...

pandas - 根据行的时间创建新列

我有一个由datetime(Datetime)、sensor_id(int)、value(float)组成的pandas数据框。传感器id是不同的列,如下所示,我只显示两个传感器idts6206116...

最新文章