如何聚合相同的鍵值并取該值的平均值?
[['Absard', 140000.0], ['Absard', 150000.0], ['Absard', 150000.0], ['Absard', 173333.3], ['Abuzar', 28333.3], ['Abuzar', 34000.0], ['Abuzar', 90500.0], ['Afsarieh', 37333.3], ['Afsarieh', 44333.3], ['Afsarieh', 51666.6], ['Afsarieh', 55000.0], ['Afsarieh', 80000.0], ['Afsarieh', 105000.0], ['Ahang', 26666.6], ['Ahang', 46666.6], ['Air force', 55000.0], ['Air force', 56333.3]]
我想像這樣列印出這個串列,
NAME AVG.
----------------------
Abazar 3033333.33
Ahang 2666666.67
Air force 2333333.33
Afsarieh 1916666.67
這 5 個預計將存盤在字典中(平均值是隨機寫入的)
寫了這樣的東西,但是這個聚合不正確
def takeAvg(addressList):
resultDict = {}
tot = 0
startIndex = 0
inner_i = 1
for inner_i in range(len(addressList)):
if(addressList[startIndex][0] == addressList[inner_i][0]):
tot = float(addressList[inner_i][1])
else:
tot = float(addressList[startIndex][1])
resultDict.update({addressList[startIndex][0]: format(float(tot / (inner_i-startIndex)), ".2f")})
tot = 0
startIndex = inner_i
return resultDict
uj5u.com熱心網友回復:
你可以迭代你的資料,排序成一個defaultdict
串列,然后平均每個鍵的結果:
from collections import defaultdict
data = [['Absard', 140000.0], ['Absard', 150000.0], ['Absard', 150000.0], ['Absard', 173333.3], ['Abuzar', 28333.3], ['Abuzar', 34000.0], ['Abuzar', 90500.0], ['Afsarieh', 37333.3], ['Afsarieh', 44333.3], ['Afsarieh', 51666.6], ['Afsarieh', 55000.0], ['Afsarieh', 80000.0], ['Afsarieh', 105000.0], ['Ahang', 26666.6], ['Ahang', 46666.6], ['Air force', 55000.0], ['Air force', 56333.3]]
acc = defaultdict(list)
for name, value in data:
acc[name].append(value)
result = { k : sum(v)/len(v) for k, v in acc.items() }
輸出:
{
'Absard': 153333.325,
'Abuzar': 50944.43333333333,
'Afsarieh': 62222.200000000004,
'Ahang': 36666.6,
'Air force': 55666.65
}
出于顯示目的,您可以使用 f 字串將值列印為 2 位小數。例如
print(*[f'{k:16}\t{v:.2f}\n' for k, v in result.items()], end='')
輸出:
Absard 153333.33
Abuzar 50944.43
Afsarieh 62222.20
Ahang 36666.60
Air force 55666.65
uj5u.com熱心網友回復:
您可以使用itertools.groupby
l = [['Absard', 140000.0], ['Absard', 150000.0], ['Absard', 150000.0], ['Absard', 173333.3], ['Abuzar', 28333.3], ['Abuzar', 34000.0], ['Abuzar', 90500.0], ['Afsarieh', 37333.3], ['Afsarieh', 44333.3], ['Afsarieh', 51666.6], ['Afsarieh', 55000.0], ['Afsarieh', 80000.0], ['Afsarieh', 105000.0], ['Ahang', 26666.6], ['Ahang', 46666.6], ['Air force', 55000.0], ['Air force', 56333.3]]
for k, g in groupby(l, key=lambda x: x[0]):
values = [_[1] for _ in g]
print(k, sum(values) / len(values), sep='\t')
輸出
Absard 153333.325
Abuzar 50944.43333333333
Afsarieh 62222.200000000004
Ahang 36666.6
Air force 55666.65
這假設所有“鍵”一起出現 - 例如,如果“Absard”再次出現在串列的末尾,您將獲得“Absard”的 2 個均值。您可以通過在將串列傳遞到之前對串列進行排序來確保itertools.groupby
-
l = sorted(l, key=lambda x: x[0])
uj5u.com熱心網友回復:
如果將其轉換為以串列為值的 dict,然后迭代 dict 以獲取平均值,則可以這樣做:
data = [['Absard', 140000.0], ['Absard', 150000.0], ['Absard', 150000.0], ['Absard', 173333.3], ['Abuzar', 28333.3], ['Abuzar', 34000.0], ['Abuzar', 90500.0], ['Afsarieh', 37333.3], ['Afsarieh', 44333.3], ['Afsarieh', 51666.6], ['Afsarieh', 55000.0], ['Afsarieh', 80000.0], ['Afsarieh', 105000.0], ['Ahang', 26666.6], ['Ahang', 46666.6], ['Air force', 55000.0], ['Air force', 56333.3]]
res = {_lst[0]: [] for _lst in data}
for _lst in data:
name, num = _lst
res[name].append(num)
res = {k: round(sum(v) / len(v), 2) for k, v in res.items()}
print(res)
{'Absard': 153333.33, 'Abuzar': 50944.43, 'Afsarieh': 62222.2, 'Ahang': 36666.6, 'Air force': 55666.65}
不是所有迭代的最有效解決方案,但我希望它很容易遵循。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/492615.html