我有一个一百万行的列表(csv),如下所示:
Keyword,URL
Word1,URL1
Word1,URL2
..
Word1,URL100
Word2,URL4
Word1,URL101,
..
Word10000,URLN
因此,我有10,000个关键字,每个关键字有100个网址。每个网址都可以与一个或多个关键字相关。
我需要获取一个Pandas数据框(或csv),如下所示:
Keyword1,Keyword2,Weight
Word1,Word2,5
Word1,Word3,6
其中权重是我发现的每对关键字的相等URL数量。因此,在我的示例中,我假设“ Word1”和“ Word2”具有5个共享URL。
我使用了Pandas,并且在数据帧上进行了嵌套迭代,但是我需要一种更有效的方法,前提是嵌套迭代并不是执行此任务的最佳方法。
for index, row in keylist.iterrows():
keyurlcompare = keyurl[keyurl['Keyword'] == row['Keyword']]
idx1 = pd.Index(keyurlcompare['URL'])
# Second iterations
for index2, row2 in keylist.iterrows():
keyurlcompare2 = keyurl[keyurl['Keyword'] == row2['Keyword']]
idx2 = pd.Index(keyurlcompare2['URL'])
# Intersection evaluation
interesectw = idx1.intersection(idx2)
we = len(interesectw)
if we > 0 and row['Keyword'] != row2['Keyword']:
df1 = pd.DataFrame([[row['Keyword'],row2['Keyword'],we]],columns=['Source', 'Target', 'Weight'])
df = df.append(df1)
print('Keyword n. ' + str(index) + ' (' + row['Keyword'] + ') con Keyword n. ' + str(index2) + ' (' + row2['Keyword'] +') - Intersect: ' + str(we))
它可以正常工作,我可以打印这种输出:
Keyword n. 0 (word1) with Keyword n. 9908 (word2) - Intersect: 1
Keyword n. 0 (word1) with Keyword n. 10063 (word3) - Intersect: 12
Keyword n. 0 (word1) con Keyword n. 10064 (word4) - Intersect: 1
但是它显然非常慢。您能帮我找到一种更有效的方法来执行此任务吗?
答案 0 :(得分:0)
我会尝试撤消该处理:
代码可能是:
detail = df.groupby('URL').apply(
lambda z: pd.DataFrame(list(itertools.combinations(z.Keyword,2)),
columns=['Keyword1', 'Keyword2']))
result = detail.reset_index(level=0).groupby(
['Keyword1', 'Keyword2']).count().rename({'URL': 'Weight'}).reset_index()
result
数据框应该是您想要的
要获取大数据,细节是相当昂贵的,在一台像样的机器上几分钟(对于您给出的数据大小的数量级),结果要快得多。但是,如果计算机的RAM大于12 GB,至少应该没有内存错误