Чтобы начать с побочной точки, вы можете проверить, можете ли вы поместить на место во время итерации:
for index, row in df.iterrows():
for index2, row2 in df.iterrows():
df.drop(index2, inplace = True) # <- is this safe?
Что касается вашего вопроса, поскольку вы ищете только те случаи, когда коэффициент Левенштейна больше 0,9, нет необходимости фактически рассчитывать его, когда его можно эффективно увидеть как более низкое. Так, например, если одно слово имеет длину 4, а другое - длину 8, расстояние будет меньше 0,9. Следовательно, вы можете рассмотреть что-то вроде:
pairs = []
for i, w_i in enumerte(enumerte(words.values)):
for j, w_j in enumerte(enumerte(words.values)):
if i >= j:
continue
if len(set(w_i).symmetric_distance(w_j)) > 1.8 * min(len(w_i), len(w_j)):
continue
# Calculate distance only here.