简体   繁体   English

如何根据组合键值总结字典值?

[英]How to sum up dict values based on combined key values?

My question is similar to this( Python sum on keys for List of Dictionaries ), but need to sum up the values based on two or more key-value elements.我的问题与此类似( Python sum on keys for List of Dictionaries ),但需要根据两个或多个键值元素对值求和。 I have a list of dictionaries as following:我有一个字典列表如下:

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}]
            

So based on a combination of Name and City key values, amt should be summed.因此,根据 Name 和 City 键值的组合,应该对 amt 求和。 Please let me know how to solve this.请让我知道如何解决这个问题。

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

You could create a collections.Counter .Then you can simply add the values as the appear using the tuple as (Name, City) as the key:您可以创建一个collections.Counter 。然后您可以使用元组 as (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
      

This will produce a dictionary-like object Counter :这将产生一个类似字典的 object Counter

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

With this you can convert the dict back to a list of dicts like:有了这个,您可以将字典转换回字典列表,例如:

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

giving sums_list :给出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)

output: output:

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

Besides the answers proposed by the others, it can be done in a pandas one-liner.除了其他人提出的答案外,它可以在 pandas 一行中完成。 It groups rows by name and city and calculates the sum over their amt feature.它按名称和城市对行进行分组,并计算其 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM