我有以下数据框:
d_test = {
'name' : ['South Beach', 'Dog', 'Bird', 'Ant', 'Big Dog', 'Beach', 'Dear', 'Cat'],
'cluster_number' : [1, 2, 3, 3, 2, 1, 4, 2]
}
df_test = pd.DataFrame(d_test)
我想识别相似的名字name
列(如果这些名称属于一个簇号)并为它们创建唯一的 ID。例如South Beach
and Beach
属于簇号1
而且他们的相似度得分相当高。所以我们将它与唯一的 id 关联起来,比如说1
。下一个簇是数字2
和三个实体来自name
属于该簇的列:Dog
, Big Dog
and Cat
. Dog
and Big Dog
具有很高的相似度分数,并且他们的唯一 ID 是,比如说2
. For Cat
唯一的ID将是,比如说3
。等等。
我为上面的逻辑创建了一个代码:
# pip install thefuzz
from thefuzz import fuzz
d_test = {
'name' : ['South Beach', 'Dog', 'Bird', 'Ant', 'Big Dog', 'Beach', 'Dear', 'Cat'],
'cluster_number' : [1, 2, 3, 3, 2, 1, 4, 2]
}
df_test = pd.DataFrame(d_test)
df_test['id'] = 0
i = 1
for index, row in df_test.iterrows():
for index_, row_ in df_test.iterrows():
if row['cluster_number'] == row_['cluster_number'] and row_['id'] == 0:
if fuzz.ratio(row['name'], row_['name']) > 50:
df_test.loc[index_,'id'] = int(i)
is_i_used = True
if is_i_used == True:
i += 1
is_i_used = False
代码生成预期结果:
name cluster_number id
0 South Beach 1 1
1 Dog 2 2
2 Bird 3 3
3 Ant 3 4
4 Big Dog 2 2
5 Beach 1 1
6 Dear 4 5
7 Cat 2 6
注意,对于Cat
we got id
as 6
但这很好,因为无论如何它都是独一无二的。
虽然上面的算法适用于测试数据,但我无法将其用于我拥有的真实数据(大约 100 万行),并且我试图了解如何矢量化代码并摆脱两个 for 循环。
Also thefuzz
模块有process
函数,它允许立即处理数据:
from thefuzz import process
out = process.extract("Beach", df_test['name'], limit=len(df_test))
但我不知道它是否有助于加快代码速度。