簡體   English   中英

如何根據組合鍵值總結字典值?

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

我的問題與此類似( Python sum on keys for List of Dictionaries ),但需要根據兩個或多個鍵值元素對值求和。 我有一個字典列表如下:

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 。然后您可以使用元組 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
      

這將產生一個類似字典的 object Counter

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

有了這個,您可以將字典轉換回字典列表,例如:

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)

output:

{('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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM