查找哪些列表共享元素的更快方法

时间:2020-07-26 11:03:32

标签: python pandas

我有一个形状为(142000,1)的熊猫数据框,其中有一列名为关键字的列,其中每个单元格都包含一个关键字列表。

我想检查哪些行具有至少一个相等的关键字。

for i in combinations(list(range(len(df.index))), 2):
    if set(df['keywords'][i[0]]) & set(df['keywords'][i[1]]):
        do_something() # this runs reasonably fast, no problem here

凝固物的工作方式如下:set([1,2,3]) & set([3,4,5]) = {3}。因此,实际上只是检查列表是否共享任何项目。

问题很严重,因为我们总共进行了142000!/ [(142000-2)!2!]次迭代。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

创建一个从关键字到该关键字出现的所有索引的集合的索引(我对Pandas不太熟悉,因此您可能需要解决一些问题)

keyword_index = defaultdict(set)
for i, keywords in enumerate(df['keywords']):
    for keyword in keywords:
        keyword_index[keyword].add(i)

然后遍历索引,并对出现在多个索引处的所有关键字执行以下操作:

for keyword, indices in keyword_index.items():
    if len(indices) >= 2:
        do_something()

您必须决定如何处理多于两行的关键字。如果要分别处理每个组合,则仍然是原始代码中最差的O(n ^ 2)。