Python dict中特定键的和值

Python dict中特定键的和值,python,python-3.x,dictionary,collections,Python,Python 3.x,Dictionary,Collections,我有一张清单,上面写着: source_dict = [{'ppl': 10, 'items': 15, 'airport': 'lax', 'city': 'Los Angeles', 'timestamp': 1, 'region': 'North America', 'country': 'United States'}, {'ppl': 20, 'items': 32, 'airport': 'JFK', 'city': 'New York', 'timestamp': 2, 'regi

我有一张清单,上面写着:

source_dict = [{'ppl': 10, 'items': 15, 'airport': 'lax', 'city': 'Los Angeles', 'timestamp': 1, 'region': 'North America', 'country': 'United States'},
{'ppl': 20, 'items': 32, 'airport': 'JFK', 'city': 'New York', 'timestamp': 2, 'region': 'North America', 'country': 'United States'},
{'ppl': 50, 'items': 20, 'airport': 'ABC', 'city': 'London', 'timestamp': 1, 'region': 'Europe', 'country': 'United Kingdom'}... ]

#Gets the list of countries in the dict
countries  = list(set(stats['country'] for stats  in source_dict))
我知道我可以使用收藏:

    counter = collections.Counter()

    for d in source_dict:
        counter.update(d)
但是,我们希望按国家分组,只获取某些键的总数,而不是所有键的总数

所以结果应该是

{'Country': 'United States', 'p95': 30, 'items':37},
{'Country': 'England', 'ppl': 50, 'items':20},...

我不知道如何将多个钥匙合并到一个计数器中。要生成该结果,这是一种使用
collections.defaultdict
collections.Counter
的方法

Ex:

from collections import defaultdict, Counter

source_dict = [{'ppl': 10, 'items': 15, 'airport': 'lax', 'city': 'Los Angeles', 'timestamp': 1, 'region': 'North America', 'country': 'United States'},
{'ppl': 20, 'items': 32, 'airport': 'JFK', 'city': 'New York', 'timestamp': 2, 'region': 'North America', 'country': 'United States'},
{'ppl': 50, 'items': 20, 'airport': 'ABC', 'city': 'London', 'timestamp': 1, 'region': 'Europe', 'country': 'United Kingdom'} ]

result = defaultdict(Counter)
for stats in source_dict:
    result[stats['country']].update(Counter({'ppl': stats['ppl'], "items": stats['items']}))

#result = [{'Country': k, **v} for k, v in result.items()]  #Required output
print(result) 
defaultdict(<class 'collections.Counter'>,
            {'United Kingdom': Counter({'ppl': 50, 'items': 20}),
             'United States': Counter({'items': 47, 'ppl': 30})})
输出:

from collections import defaultdict, Counter

source_dict = [{'ppl': 10, 'items': 15, 'airport': 'lax', 'city': 'Los Angeles', 'timestamp': 1, 'region': 'North America', 'country': 'United States'},
{'ppl': 20, 'items': 32, 'airport': 'JFK', 'city': 'New York', 'timestamp': 2, 'region': 'North America', 'country': 'United States'},
{'ppl': 50, 'items': 20, 'airport': 'ABC', 'city': 'London', 'timestamp': 1, 'region': 'Europe', 'country': 'United Kingdom'} ]

result = defaultdict(Counter)
for stats in source_dict:
    result[stats['country']].update(Counter({'ppl': stats['ppl'], "items": stats['items']}))

#result = [{'Country': k, **v} for k, v in result.items()]  #Required output
print(result) 
defaultdict(<class 'collections.Counter'>,
            {'United Kingdom': Counter({'ppl': 50, 'items': 20}),
             'United States': Counter({'items': 47, 'ppl': 30})})
defaultdict(,
{'United Kingdom':计数器({'ppl':50,'items':20}),
“美国”:计数器({'items':47,'ppl':30})

这是一种使用
collections.defaultdict
collections.Counter
的方法

Ex:

from collections import defaultdict, Counter

source_dict = [{'ppl': 10, 'items': 15, 'airport': 'lax', 'city': 'Los Angeles', 'timestamp': 1, 'region': 'North America', 'country': 'United States'},
{'ppl': 20, 'items': 32, 'airport': 'JFK', 'city': 'New York', 'timestamp': 2, 'region': 'North America', 'country': 'United States'},
{'ppl': 50, 'items': 20, 'airport': 'ABC', 'city': 'London', 'timestamp': 1, 'region': 'Europe', 'country': 'United Kingdom'} ]

result = defaultdict(Counter)
for stats in source_dict:
    result[stats['country']].update(Counter({'ppl': stats['ppl'], "items": stats['items']}))

#result = [{'Country': k, **v} for k, v in result.items()]  #Required output
print(result) 
defaultdict(<class 'collections.Counter'>,
            {'United Kingdom': Counter({'ppl': 50, 'items': 20}),
             'United States': Counter({'items': 47, 'ppl': 30})})
输出:

from collections import defaultdict, Counter

source_dict = [{'ppl': 10, 'items': 15, 'airport': 'lax', 'city': 'Los Angeles', 'timestamp': 1, 'region': 'North America', 'country': 'United States'},
{'ppl': 20, 'items': 32, 'airport': 'JFK', 'city': 'New York', 'timestamp': 2, 'region': 'North America', 'country': 'United States'},
{'ppl': 50, 'items': 20, 'airport': 'ABC', 'city': 'London', 'timestamp': 1, 'region': 'Europe', 'country': 'United Kingdom'} ]

result = defaultdict(Counter)
for stats in source_dict:
    result[stats['country']].update(Counter({'ppl': stats['ppl'], "items": stats['items']}))

#result = [{'Country': k, **v} for k, v in result.items()]  #Required output
print(result) 
defaultdict(<class 'collections.Counter'>,
            {'United Kingdom': Counter({'ppl': 50, 'items': 20}),
             'United States': Counter({'items': 47, 'ppl': 30})})
defaultdict(,
{'United Kingdom':计数器({'ppl':50,'items':20}),
“美国”:计数器({'items':47,'ppl':30})

在熊猫中,您可以执行以下操作:

import io
import pandas as pd

dff=io.StringIO("""ppl,items,airport,city,timestamp,region,country
10,15,lax,Los Angeles,1,North America,United States
20,32,JFK,New York,2,North America,United States
50,20,ABC,London,1,Europe,United Kingdom""")

df3=pd.read_csv(dff)                                                                                                                                                

df3                                                                                                                                                                 

   ppl  items airport         city  timestamp         region         country
0   10     15     lax  Los Angeles          1  North America   United States
1   20     32     JFK     New York          2  North America   United States
2   50     20     ABC       London          1         Europe  United Kingdom

df3.groupby('region').agg({'ppl':'sum', 'items':'sum'})                                                                                                             

#               ppl  items
#region                   
#Europe          50     20
#North America   30     47


在熊猫中,您可以执行以下操作:

import io
import pandas as pd

dff=io.StringIO("""ppl,items,airport,city,timestamp,region,country
10,15,lax,Los Angeles,1,North America,United States
20,32,JFK,New York,2,North America,United States
50,20,ABC,London,1,Europe,United Kingdom""")

df3=pd.read_csv(dff)                                                                                                                                                

df3                                                                                                                                                                 

   ppl  items airport         city  timestamp         region         country
0   10     15     lax  Los Angeles          1  North America   United States
1   20     32     JFK     New York          2  North America   United States
2   50     20     ABC       London          1         Europe  United Kingdom

df3.groupby('region').agg({'ppl':'sum', 'items':'sum'})                                                                                                             

#               ppl  items
#region                   
#Europe          50     20
#North America   30     47


我选择这个作为答案,因为我的很多东西无论如何都会变成一个数据帧,但在我把它放入DF之前,我打算对它进行聚合。对于我的用例来说,这是一个很好的解决方案。我选择这个作为答案,因为我的很多东西无论如何都会变成一个数据帧,但在我将其放入DF之前,我打算对其进行聚合。对于我的用例来说,这是一个很好的解决方案。如果我没有使用数据帧,我也会这样做。想知道,仅计数器“求和”字段你能修改它吗,例如,求和1个键,但平均另一个键?这也非常有效,如果我没有使用数据帧,我会这样做。想知道,计数器只能对字段进行“求和”,您可以修改它,例如,对一个键求和,但对另一个键求平均值吗?