Python通过删除列来实现高效的元素级比较

Python通过删除列来实现高效的元素级比较,python,performance,pandas,Python,Performance,Pandas,我正在处理一个len(df)=100.000的数据帧,它看起来像这样: | ref_id | title | 01 "Test title" 02 "Title 2" 03 "Test Title" 我想在标题的levenshtein比率大于0.8的情况下聚合所有引用ID 我的函数如下所示: def match_title(title_a, title_b): return True if Levenshtein.

我正在处理一个len(df)=100.000的数据帧,它看起来像这样:

| ref_id | title           |
   01       "Test title"
   02       "Title 2"
   03       "Test Title"
我想在标题的levenshtein比率大于0.8的情况下聚合所有引用ID

我的函数如下所示:

def match_title(title_a, title_b):
   return True if Levenshtein.ratio(title_a, title_b) > 0.8 else False
因为我必须将每个标题与每个标题进行比较,所以它会变得很昂贵(100k*100k)。但我只是想删除数据帧中已经匹配的元素以加快计算速度:

match = []
for element in df.itertuples():
    indices_series = df.apply(lambda x: match_title(
        x['title'], element.title), axis=1)
    indices = df[indices_series].ref_id.as_matrix()
    if indices.size:
        match.append(set(indices))
        df.drop(indices,inplace=True)
return match
所以我的输出是这样的

[(01,03),(02)...]
不幸的是,它仍然很慢,每次迭代需要约3秒,这将导致总共4天


有谁能给我一个建议如何加速这一切?感谢您提供的任何帮助

您可以从执行
df['title\u lower']=df.title.applymap('lower')中获得一些价值;groupby('title\u lower')
,它至少会为您提供完全匹配的所有标题(不区分大小写)。我不知道有多少。你的简化有效吗?L(abc,bcd)=1,L(bcd,cde)=1,但L(abc,cde)=2,这通常可能是一个问题(即,您是否将bcd的refid与abc,或cde分组?),我预计不同标题的总数量为10到15k。按照您的建议进行分组可能会有所帮助,因为许多字符串是相同的。但是我应该先分组,然后迭代这些组,还是应该如何将其集成到函数中?