为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2021-04-16 14:15:51
我有这种格式的数据: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,我将失去顺序
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

from collections import defaultdict, Counter, OrderedDict

ld = [{'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}))])



查看完整回答
反对 回复 2021-04-27
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

from pprint import pprint

from collections import Counter, OrderedDict


d = {

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


查看完整回答
反对 回复 2021-04-27
?
皈依舞

TA贡献1851条经验 获得超3个赞

您可以使用嵌套字典理解。相关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}}}



查看完整回答
反对 回复 2021-04-27
  • 3 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信