Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将两个文件中一列中的值与其在另一列中的对应值进行聚合_Python_Pandas_Data Analysis_Defaultdict_Bigdata - Fatal编程技术网

Python 将两个文件中一列中的值与其在另一列中的对应值进行聚合

Python 将两个文件中一列中的值与其在另一列中的对应值进行聚合,python,pandas,data-analysis,defaultdict,bigdata,Python,Pandas,Data Analysis,Defaultdict,Bigdata,有一个关于将重复键的多个值相加为一个键并加总的问题。例如: 1:5 2:4 3:2 1:4 非常基本,但我正在寻找如下输出: 1:9 2:4 3:2 在我使用的两个文件中,我处理的是一个列表,其中有51个用户(user_artists.dat的第1列)拥有artistID(第2列),以及该用户听了权重(第3列)给出的特定艺术家的次数 我正在尝试汇总所有用户播放艺术家的总时间,并以如下格式显示: 布兰妮·斯皮尔斯(289)2393140。任何帮助或意见都将不胜感激 import codecs #f

有一个关于将重复键的多个值相加为一个键并加总的问题。例如: 1:5 2:4 3:2 1:4 非常基本,但我正在寻找如下输出: 1:9 2:4 3:2

在我使用的两个文件中,我处理的是一个列表,其中有51个用户(user_artists.dat的第1列)拥有artistID(第2列),以及该用户听了权重(第3列)给出的特定艺术家的次数

我正在尝试汇总所有用户播放艺术家的总时间,并以如下格式显示: 布兰妮·斯皮尔斯(289)2393140。任何帮助或意见都将不胜感激

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)
那么:

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 
导入编解码器
从集合导入defaultdict
#阅读材料
使用codecs.open(“artists.dat”,encoding=“utf-8”)作为f:
艺术家=f.阅读线()
使用codecdes.open(“user_artists.dat”,encoding=“utf-8”)作为f:
users=f.readlines()
#转换dict中的艺术家数据,将“艺术家id”作为键,“艺术家名称”作为值
Artister_repo=dict(x.strip().split('\t')[:2]表示艺术家[1:]
用户_stats_list=[x.strip().split('\t'),用于用户中的x][1:]
分组用户统计=defaultdict(lambda:0)
对于用户统计列表中的u:
#userID,artistID,weight=u
分组的_user_stats[u[0]]+=int(u[2])#在一个dict中累积权重,艺术家id作为键,wights的总和作为值
#额外:“幻想”数据以“(艺术家id)”格式转换dict的键
grouped_user_stats=在grouped_user_stats.iteritems()中,k和v的dict((“%s(%s)”%)(艺术家报告获取(k,“未知艺术家”),v)
#最后打印出来
对于k,v,在分组的用户统计信息中。iteritems()
打印k,v

嗨!感谢您的回复,没有定义“items”吗?我一直在试图弄清楚它应该是什么,或者它应该如何初始化,但无法使它工作。是的,很抱歉,这是一个我想要的输入错误。“.iteritems()”以编写结束。“.iter(items)”谢谢!它现在的读数是:artist_repo=dict(x.strip().split('\t')[::-1]for x in artists[1:])ValueError:dictionary update sequence元素#0的长度为4;2是必需的。没有关系!非常感谢。双重错误。。。1) 我原以为artists.dat文件只有两列,2)因为误读了您的代码,认为数据是“艺术家姓名,艺术家id”,我错了。。。而不是“[::-1]”(颠倒列表)我放了一个“[:2]”(获取前2个元素)你就是男人!!!!!!!重量不重了,但我大概能猜出来。关于我可能需要调试的地方有什么提示吗?