python - 评估键值列表重叠的更有效方法(熊猫)
问题描述
我有一个 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
但这显然非常慢。你能帮我找到一种更有效的方法来执行这项任务吗?
解决方案
我会尝试反转处理:
- 查找每个 URL 的所有关键字
- 构建一个数据框,为每个 URL 提供所有关键字对
- 对每对出现的次数求和
代码可以是:
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 的机器出现内存错误
推荐阅读
- r - 列表列表列表到带有 purrr 的数据框中
- networking - 在 3 次握手中,服务器没有收到客户端的 ACK 消息时会发生什么?
- file - Lisp - 使用低内存占用写入文件
- xamarin - 如何从不同的视图添加到 ObservableCollection?
- javascript - onclick后运行获取数据的函数
- python - 作为初学者理解 Gurobi Python
- java - 模块信息.java 设置
- python - 使用 python 加密 AES 256 CBC 并使用 PHP 解密
- sql - 如何检查数组是否使用 SQL 排序?
- pytorch - 标记器解码步骤中的标记到单词映射?