我有以下亂數字串列:
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
任何幫助、快捷方式或檔案正確部分的鏈接將不勝感激。
結果不必是字典。它可以是任何東西,例如一個新的資料幀,只要計算是高效的,并且如果可能的話是優雅的。
謝謝你的時間 !
uj5u.com熱心網友回復:
如何使用collections.defaultdict和zip(或itertools.pairwise對于 python 3.10 ):
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}
uj5u.com熱心網友回復:
熊貓方法
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}
uj5u.com熱心網友回復:
您可以使用自身偏移 1 的數字串列創建一個資料框,然后用于groupby為每個數字生成平均值:
numbers = [1, 3, 5, 5, 2, 4, 1, 5, 4, 5, 2, 2]
df = pd.DataFrame(zip(numbers, numbers[1:]), columns=['num', 'next'])
df.groupby('num').mean().reset_index().rename(columns={'next':'mean'})
輸出
num mean
0 1 4.00
1 2 3.00
2 3 5.00
3 4 3.00
4 5 3.25
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477438.html
