di中特定键的和值

2024-04-29 14:50:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个目录,看起来像这样:

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))

我知道我可以使用a系列:

    counter = collections.Counter()

    for d in source_dict:
        counter.update(d)

但是,我们想按国家分组,只得到某些键的总数,而不是所有键的总数。你知道吗

所以结果应该是

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

我不知道如何将多个键合并到一个计数器中。产生这样的结果


Tags: theincitysourceitemspplcountryregion
2条回答

在熊猫中,您可以这样做:

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

这是一种使用collections.defaultdict&;collections.Counter的方法。你知道吗

例如:

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

相关问题 更多 >