首页 > 解决方案 > 评估键值列表重叠的更有效方法(熊猫)

问题描述

我有一个 1M 行的列表(csv),如下所示:

Keyword,URL

Word1,URL1
Word1,URL2
..
Word1,URL100
Word2,URL4
Word1,URL101,
..
Word10000,URLN

所以我有 10,000 个关键字,每个关键字有 100 个 URL。每个 URL 可能与一个或多个关键字相关。

我需要获取 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

但这显然非常慢。你能帮我找到一种更有效的方法来执行这项任务吗?

标签: pythonpandasdataframe

解决方案


我会尝试反转处理:

  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数据框应该是你想要的

使用大数据获取细节是相当昂贵的,在一台像样的机器上几分钟就可以得到你给出的数据大小的数量级,结果要快得多。但至少应该不会有超过 12 GB RAM 的机器出现内存错误


推荐阅读