猿问

在python中对相似值进行分组和求和

我有这种格式的数据:


d = [

 {'key': '2018-05-10', 'vals': {'Clicks': 229, 'Link Clicks': 210}},

 {'key': '2018-05-11', 'vals': {'Clicks': 365, 'Link Clicks': 379}},


 {'key': '2018-05-10', 'vals': {'Clicks': 139, 'Link Clicks': 11}},

 {'key': '2018-05-11', 'vals': {'Clicks': 1348, 'Link Clicks': 73}},


]

即,它具有相同的多个条目 key


我希望它对它进行分组,以便Clicks&Link Clicks归纳共同的日期:


所以输出应该像这样:


d = [

 {'key': '2018-05-10', 'vals': {'Clicks': 368, 'Link Clicks': 221}},

 {'key': '2018-05-11', 'vals': {'Clicks': 1713, 'Link Clicks': 452}},

]

我想到了首先通过使用将值分组在一起defaultdict:


from collections import defaultdict


    dd = defaultdict(list)


    for i in d:                        

        dd[i['key']].append(i['vals'])

它给出以下输出:


{ 2018-05-10': [

             {'Clicks': 229, 'Link Clicks': 210},

             {'Clicks': 139, 'Link Clicks': 11}

              ],

 '2018-05-11': [

             {'Clicks': 365, 'Link Clicks': 379},

             {'Clicks': 1348, 'Link Clicks': 73}

             ]}

现在,我认为我可以Counter用来总结价值,但我知道如何去做。同样,键的名称(即Clicks&Link Clicks可能会更改&vals可以包含两个以上的条目)。


还可以不用使用它defaultdict吗?有没有更好的方法?


注意:我认为使用defaultdict的方法并不理想,因为我一直希望按日期对数据进行排序,而一旦我使用dict,我将失去顺序


守着一只汪
浏览 193回答 3
3回答

米脂

from collections import defaultdict, Counter, OrderedDictld = [{'key': '2018-05-10', 'vals': {'Clicks': 229, 'Link Clicks': 210}}, {'key': '2018-05-11', 'vals': {'Clicks': 365, 'Link Clicks': 379}}, {'key': '2018-05-10', 'vals': {'Clicks': 139, 'Link Clicks': 11}}, {'key': '2018-05-11', 'vals': {'Clicks': 1348, 'Link Clicks': 73}}]out=defaultdict(Counter())for d in ld:    out[d['key']].update(d['vals'])new = OrderedDict(sorted(out.items()))print(new)# OrderedDict([('2018-05-10', Counter({'Clicks': 368, 'Link Clicks': 221})), ('2018-05-11', Counter({'Clicks': 1713, 'Link Clicks': 452}))])

蝴蝶刀刀

from pprint import pprintfrom collections import Counter, OrderedDictd = {'2018-05-10': [             {'Clicks': 229, 'Link Clicks': 210},             {'Clicks': 139, 'Link Clicks': 11}              ], '2018-05-11': [             {'Clicks': 365, 'Link Clicks': 379},             {'Clicks': 1348, 'Link Clicks': 73}             ],}m = OrderedDict()for k, v in d.items():    m[k] = Counter()    for i in v:        m[k].update(i)    m[k] = dict(m[k])    # or if you want to keep the 'vals' key and list:    # m[k] = [{"vals": dict(m[k])}]pprint(m)输出:OrderedDict([('2018-05-11', {'Clicks': 1713, 'Link Clicks': 452}),             ('2018-05-10', {'Clicks': 368, 'Link Clicks': 221})])

皈依舞

您可以使用嵌套字典理解。相关c_type键(即Clicks&Link Clicks)是从每个日期的第一个列表中派生的。否则,该方法自然会接受任意数量的类别。res = {k: {'vals': {c_type: sum(item[c_type] for item in v) for c_type in v[0]}}       for k, v in dd.items()}{'2018-05-10': {'vals': {'Clicks': 368, 'Link Clicks': 221}}, '2018-05-11': {'vals': {'Clicks': 1713, 'Link Clicks': 452}}}
随时随地看视频慕课网APP

相关分类

Python
我要回答