我有以下随机数字列表:
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.defaultdict
和 zip
(或 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}