【问题标题】:How to aggregate dataset by multiple keys in python?如何在python中通过多个键聚合数据集?
【发布时间】:2016-09-07 23:54:10
【问题描述】:

我想总结数据集,组合了唯一键 (例如 - (曲目,歌手)。

例如:我有 3 个字段的数据集:track、singer、cnt 我想按曲目和歌手汇总(汇总)数据,汇总 cnt 字段。

sales = [
    {'singer': 'Smash',  'track':  'Cry', 'cnt': 10},
    {'singer': 'Smash',  'track':  'Cry', 'cnt': 11},
    {'singer': 'Smash',  'track':  'Dry', 'cnt': 2},
    {'singer': 'Scooter', 'track': 'Shy', 'cnt': 1},
    {'singer': 'Scooter', 'track': 'Die', 'cnt': 0},
]

我想要:

sales = [
    {'singer': 'Smash',  'track':  'Cry', 'cnt': 21},   <== summmarized
    {'singer': 'Smash',  'track':  'Dry', 'cnt': 2},
    {'singer': 'Scooter', 'track': 'Shy', 'cnt': 1},
    {'singer': 'Scooter', 'track': 'Die', 'cnt': 0},
]

感谢回复。

【问题讨论】:

    标签: python django sum dataset aggregation


    【解决方案1】:

    您基本上是在寻找由singertrack 分组的cnt 中的Sum。在 Django 中,这可以使用 valuesannotate in conjunction 来实现。

    所以试试这样的:

    Sale.objects.values('singer', 'track').annotate(Sum('cnt'))
    

    【讨论】:

    • 谢谢,但正如你所见,我使用的是数据集,而不是对象;比,如何将我的数据集转换为对象以使用您的功能?
    • 啊,我没注意到,那么Django 在这里帮不了你,你需要自己做,据我所知,你已经做到了。
    【解决方案2】:

    创建了我自己的解决方案:

    # Aggregate dataset by multiple columns
    # @source http://stackoverflow.com/questions/24286933/how-to-reduce-aggregate-a-list-of-dicts-per-multiple-keys-in-python
    sales = [
        {'singer': 'Smash',   'track':  'Cry', 'cnt': 10},
        {'singer': 'Smash',   'track':  'Cry', 'cnt': 11},
        {'singer': 'Smash',   'track':  'Dry', 'cnt': 2},
        {'singer': 'Scooter', 'track':  'Shy', 'cnt': 1},
        {'singer': 'Scooter', 'track':  'Die', 'cnt': 0},
    ]
    
    sales_gr = {}
    
    for item in sales:
    
        key = str(''.join([item['track'], item['singer']]))
        if key not in sales_gr:
            sales_gr[key] = {'track': item['track'], 'singer':item['singer'], 'cnt':0}
    
        sales_gr[key]['cnt'] += item['cnt']
    
    print(sales_gr)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-19
      • 2013-11-27
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2015-12-06
      相关资源
      最近更新 更多