我有一个包含公司名称的数据框。我想根据名称中单词的常见程度计算每个名称的分数。
首先,我建立了一个字数字典。不确定这是否是最干净的方法,但以下矢量化方法有效:
words = itertools.chain.from_iterable(map(list, crsp.cname.str.split()))
然后我算出这些词:
wordcnts = defaultdict(int)
for w in words:
wordcnts[w] += 1
现在,我想计算每个公司名称的分数,该分数等于公司名称中出现的每个单词的wordcnts[word]
的倒数之和。
现在我正在迭代行并使用列表推导来计算总和:
score = {}
for idx, row in crsp.iterrows():
score[idx] = sum([1/wordcnts[w] for w in row.cname.split()])
有没有办法对最后一步进行矢量化?
答案 0 :(得分:1)
我认为你可以做两件事来加快速度:
用pd.DataSeries替换wordCnt:
words = itertools.chain.from_iterable(map(list, crsp.cname.str.split()))
wordcnts = pd.Series(collections.Counter(words))
使用pd.DataFrame.apply进行更快的迭代:
score = crsp.cname.apply(lambda x: (1.0/wordcnts[x.split()]).sum())