通过来自两个文件的另一列中的对应值聚合一列中的值
Posted
技术标签:
【中文标题】通过来自两个文件的另一列中的对应值聚合一列中的值【英文标题】:Aggregating values in one column by their corresponding value in another from two files 【发布时间】:2017-04-12 21:52:41 【问题描述】:有一个关于将重复键的多个值加总为一个键的问题。例如: 1:5 2:4 3:2 1:4 非常基本,但我正在寻找一个看起来像这样的输出: 1:9 2:4 3:2
在我使用的两个文件中,我正在处理具有艺术家 ID(第 2 列)的 51 个用户(user_artists.dat 的第 1 列)的列表,以及该用户听了多少次由重量(第 3 栏)。
我正在尝试汇总所有用户播放该艺术家的总次数,并以如下格式显示: Britney Spears (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)
【问题讨论】:
【参考方案1】:怎么样:
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
【讨论】:
嗨!感谢您的回复,“项目”没有定义?我一直在试图弄清楚它应该是什么或者它应该如何被初始化并且无法让它工作。 是的,很抱歉,这是一个错字,我原本打算将“.iteritems()”写成“.iter(items)” 谢谢!现在正在阅读:artist_repo = dict(x.strip().split('\t')[::-1] for x in Artists[1:]) ValueError: dictionary update sequence element #0 has length 4; 2 是必需的。没关系!非常感谢。 双重错误... 1)我原以为 Artist.dat 文件只有 2 列,2)误读了您的代码并认为数据是“艺术家姓名,艺术家 ID”,我错了......而不是“[::-1]”(反转列表)我放了一个“[:2]”(获取前2个元素) 你就是男人!!!!!!!权重已关闭,但我可能会弄清楚。关于我可能需要在哪里调试的任何提示?以上是关于通过来自两个文件的另一列中的对应值聚合一列中的值的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 PySpark 数据框的另一列中的值修改列? F.当边缘情况