我有一个形状为(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!]次迭代。
有更好的方法吗?
答案 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)。