2017-04-12 2 views
0

hatte eine Frage in Bezug auf die Summe der mehreren Werte von doppelten Schlüsseln in einem Schlüssel mit der aggregierten Summe. Zum Beispiel: 1: 5 2: 4 3: 2 1: 4 Sehr einfach, aber ich bin auf der Suche nach einem Ausgang, der wie folgt aussieht: 1: 9 2: 4 3: 2Aggregieren von Werten in einer Spalte durch den entsprechenden Wert in einem anderen von zwei Dateien

In den beiden Dateien, die ich benutze, habe ich eine Liste von 51 Benutzern (Spalte 1 von user_artists.dat), die die artistID (Spalte 2) haben und wie oft dieser Benutzer dem bestimmten Künstler zugehört hat, der durch das Gewicht angegeben wurde (Spalte 3).

Ich versuche, die Gesamtzeiten, die der Künstler gespielt wurde, über alle Benutzer zu aggregieren und es in einem Format wie anzuzeigen: Britney Spears (289) 2393140. Jede Hilfe oder Eingabe wäre so geschätzt.

import codecs 
#from collections import defaultdict 

with codecs.open("artists.dat", encoding = "utf-8") as f: 
    artists = f.readlines() 


with codecs.open("user_artists.dat", encoding = "utf-8") as f: 
    users = f.readlines() 


artist_list = [x.strip().split('\t') for x in artists][1:] 
user_stats_list = [x.strip().split('\t') for x in users][1:] 

artists = {} 
for a in artist_list: 
    artistID, name = a[0], a[1] 
    artists[artistID] = name 

grouped_user_stats = {} 
for u in user_stats_list: 
    userID, artistID, weight = u 
    grouped_user_stats[artistID] = grouped_user_stats[artistID].astype(int) 
    grouped_user_stats[weight] = grouped_user_stats[weight].astype(int) 
    for artistID, weight in u: 
     grouped_user_stats.groupby('artistID')['weight'].sum() 
     print(grouped_user_stats.groupby('artistID')['weight'].sum()) 



    #if userID not in grouped_user_stats: 
     #grouped_user_stats[userID] = { artistID: {'name': artists[artistID], 'plays': 1} } 
    #else: 
     #if artistID not in grouped_user_stats[userID]: 
      #grouped_user_stats[userID][artistID] = {'name': artists[artistID], 'plays': 1} 
     #else: 
      #grouped_user_stats[userID][artistID]['plays'] += 1 
      #print('this never happens') 




#print(grouped_user_stats) 

Antwort

0

wie etwa:

import codecs 
from collections import defaultdict 
# read stuff 
with codecs.open("artists.dat", encoding = "utf-8") as f: 
    artists = f.readlines() 
with codecs.open("user_artists.dat", encoding = "utf-8") as f: 
    users = f.readlines() 
# transform artist data in a dict with "artist id" as key and "artist name" as value 
artist_repo = dict(x.strip().split('\t')[:2] for x in artists[1:]) 

user_stats_list = [x.strip().split('\t') for x in users][1:] 

grouped_user_stats = defaultdict(lambda:0) 

for u in user_stats_list: 
    #userID, artistID, weight = u 
    grouped_user_stats[u[0]] += int(u[2]) # accumulate weights in a dict with artist id as key and sum of wights as values 
# extra: "fancying" the data transforming the keys of the dict in "<artist name> (artist id)" format 
grouped_user_stats = dict(("%s (%s)" % (artist_repo.get(k,"Unknown artist"), k), v) for k ,v in grouped_user_stats.iteritems()) 
# lastly print it 
for k, v in grouped_user_stats.iteritems(): 
    print k,v 
+0

Hallo! Danke für die Antwort, 'Artikel' ist nicht definiert? Ich habe versucht herauszufinden, was es sein soll oder wie es initialisiert werden sollte und es nicht zum Laufen bringen kann. – pythonuser890

+0

yeah, sorry darüber, es war ein Tippfehler ich beabsichtigte ".iteritems()" endete mit dem Schreiben von ".iter (items)" –

+0

Danke! Es liest jetzt: artist_repo = dict (x.strip(). Split ('\ t') [:: - 1] für x in artists [1:]) ValueError: Wörterbuchaktualisierungssequenzelement # 0 hat Länge 4; 2 ist erforderlich. Vergiss es! Vielen Dank. – pythonuser890

Verwandte Themen