评估键值列表(熊猫)重叠的更有效方法

时间:2019-06-16 16:04:19

标签: python pandas dataframe

我有一个一百万行的列表(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

但是它显然非常慢。您能帮我找到一种更有效的方法来执行此任务吗?

1 个答案:

答案 0 :(得分:0)

我会尝试撤消该处理:

  1. 找到每个URL的所有关键字
  2. 构建一个数据框,为每个URL提供所有关键字对
  3. 对每对出现的次数求和

代码可能是:

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,至少应该没有内存错误