2016-05-12 11 views
1

Ich mag Datensatz zusammenfassen, eindeutige Schlüssel (in Beispiel kombiniert zu haben - (Track, Sänger)Wie aggregiert Dataset durch mehrere Schlüssel in Python?

. Zum Beispiel: Ich habe Datensatz mit drei Feldern: Spur, Sängern, cnt ich aggregieren möge (zusammenfassen) Daten von & Sänger Spur, summzrizing cnt Feld

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}, 
] 

ich habe wollen..

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}, 
] 

Danke für Ihre Antwort

Antwort

1

Sie suchen im Grunde nach der Sum von cnt gruppiert von singer und track. In Django kann dies unter Verwendung von values und annotatein conjunction erreicht werden.

So etwas wie dies versuchen:

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

Danke, aber wie ich Sie arbeiten mit Daten-Set sehen, nicht Objekte; als, wie man meine Datenmenge in Objekte umwandelt, um deine Funktion zu benutzen? – mishaikon

+0

Ah habe ich nicht gemerkt, na dann 'Django' kann dir hier nicht helfen, du musst es selber machen und soweit ich sehen kann hast du es geschafft. – Todor

0

meine eigene Lösung:

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