如何根据组合键值来总结dict值



我的问题与此类似(Python对字典列表的键求和(,但需要基于两个或多个键值元素求和值。我有一个字典列表如下:

list_to_sum=
[{'Name': 'A', 'City': 'W','amt':100},
{'Name': 'B', 'City': 'A','amt':200},
{'Name': 'A', 'City': 'W','amt':300},
{'Name': 'C', 'City': 'X','amt':400},
{'Name': 'C', 'City': 'X','amt':500},
{'Name': 'A', 'City': 'W','amt':600}]

因此,基于Name和City键值的组合,应该对amt求和。请让我知道如何解决这个问题。

Output: [{'Name': 'A', 'City': 'W','amt':900},
{'Name': 'B', 'City': 'A','amt':200},
{'Name': 'C', 'City': 'X','amt':900}]

您可以创建一个collections.Counter。然后,您可以使用作为(Name, City)的元组作为关键字,简单地将值添加为出现的值:

from collections import Counter
list_to_sum=[
{'Name': 'A', 'City': 'W','amt':100},
{'Name': 'B', 'City': 'A','amt':200},
{'Name': 'A', 'City': 'W','amt':300},
{'Name': 'C', 'City': 'X','amt':400},
{'Name': 'C', 'City': 'X','amt':500},
{'Name': 'A', 'City': 'W','amt':600}
]

totals = Counter()
for d in list_to_sum:
totals[(d['Name'],d['City'])] += d['amt']
print(totals[('A','W')]) # 1000
print(totals[('B','A')]) # 200
print(totals[('C','X')]) # 900

这将生成一个类似字典的对象Counter:

Counter({('A', 'W'): 1000, ('B', 'A'): 200, ('C', 'X'): 900})

有了这个,你可以将dict转换回一个dict列表,比如:

sums_list = [{'Name':Name, 'City':City, 'amt':amt} for (Name, City), amt in totals.items()]

给出sums_list:

[{'Name': 'A', 'City': 'W', 'amt': 1000},
{'Name': 'B', 'City': 'A', 'amt': 200},
{'Name': 'C', 'City': 'X', 'amt': 900}]
list_to_sum = [{'Name': 'A', 'City': 'W', 'amt': 100},
{'Name': 'B', 'City': 'A', 'amt': 200},
{'Name': 'A', 'City': 'W', 'amt': 300},
{'Name': 'C', 'City': 'X', 'amt': 400},
{'Name': 'C', 'City': 'X', 'amt': 500},
{'Name': 'A', 'City': 'W', 'amt': 600}]
sum_store = {}
for entry in list_to_sum:
key = (entry['Name'], entry['City'])
if key in sum_store:
sum_store[key] += entry['amt']
else:
sum_store[key] = entry['amt']
print(sum_store)

输出:

{('A', 'W'): 1000, ('B', 'A'): 200, ('C', 'X'): 900}

除了其他人提出的答案外,它还可以在pandas一行中完成。它按名称和城市对行进行分组,并计算其amt特征的总和。

import pandas as pd
list_to_sum=[
{'Name': 'A', 'City': 'W','amt':100},
{'Name': 'B', 'City': 'A','amt':200},
{'Name': 'A', 'City': 'W','amt':300},
{'Name': 'C', 'City': 'X','amt':400},
{'Name': 'C', 'City': 'X','amt':500},
{'Name': 'A', 'City': 'W','amt':600}
]
df = pd.DataFrame(list_to_sum)
t = df.groupby(['Name','City']).amt.sum()
print(t)
Output:
Name  City
A     W       400
B     A       200
C     X       900

最新更新