Вы можете использовать пакет Levenshtein
вместе с itertools
, чтобы получить комбинации значений для двух столбцов:
import Levenshtein as lev
from itertools import product
new_df = pd.DataFrame(product(df1['Name'], df2['Name']), columns=["Name1","Name2"])
new_df["LevScore"] = new_df.apply(lambda x: lev.score(x[0],x[1]), axis=1)
print(new_df)
Name1 Name2 LevScore
0 Name1a Name1b 1
1 Name1a Name2b 2
2 Name2a Name1b 2
3 Name2a Name2b 1
EDIT
Давайте скажем, это ваш df1:
df1_n = pd.concat([df1,df1,df1]).reset_index(drop=True)
df1_n
Name Addresss ID
0 Name1a Address1a ID1a
1 Name2a Address2a ID2a
2 Name1a Address1a ID1a
3 Name2a Address2a ID2a
4 Name1a Address1a ID1a
5 Name2a Address2a ID2a
Как вы сказали, вы можете вычислить комбинации значений, взяв куски размера step
из df1_n
:
fina_df = pd.DataFrame()
step=2
for i in range(0,df1_n.shape[0],step):
new_df = pd.DataFrame(product(df1_n.iloc[i:i+step,0], df2['Name']), columns=["Name1","Name2"])
new_df["LevScore"] = new_df.apply(lambda x: lev.distance(x[0],x[1]), axis=1)
fina_df = pd.concat([fina_df, new_df], axis=0).reset_index(drop=True)
print(final_df)
Вывод:
Name1 Name2 LevScore
0 Name1a Name1b 1
1 Name1a Name2b 2
2 Name2a Name1b 2
3 Name2a Name2b 1
4 Name1a Name1b 1
5 Name1a Name2b 2
6 Name2a Name1b 2
7 Name2a Name2b 1
8 Name1a Name1b 1
9 Name1a Name2b 2
10 Name2a Name1b 2
11 Name2a Name2b 1
Для вашей ситуации измените 2 на 300 или 500. Это должно избежать переполнения всей вашей оперативной памяти, дайте мне знать, если это работает!