我目前正在清理一个数据集,该数据集显示每个人收到的姓名和礼物。
每一行都是这样的:
姓名 | |
---|---|
Agustin Dellagiovanna | 巧克力 |
Agustín Delalgiovana | 家具 |
Agustín Dellagiovanna | 艺术 |
查找字符串之间距离的一种方法是使用difflib.SequenceMatcher
,如以下代码段所示:
from difflib import SequenceMatcher
unique_names = df['Name'].unique()
threshold = 0.75
candidate_similar_names = []
for i, name1 in enumerate(unique_names[:-1]):
for name2 in unique_names[i+1:]:
similarity = SequenceMatcher(None, name1, name2).ratio()
if similarity > threshold:
candidate_similar_names.append((name1, name2, similarity))
candidate_similar_names
阈值参数越低,名称的距离就越远。
您可以使用fuzzywuzzy包,如Alperen Cetin:所示
import pandas as pd
from fuzzywuzzy import fuzz
df = pd.DataFrame({'Name': ['Agustin Dellagiovanna', 'Agustín Delalgiovanna', 'Agustín Dellagiovanna'],
'Gift': ['Chocolate', 'Furniture', 'Art']})
def func(input_list):
for i in range(len(input_list)):
for j in range(len(input_list)):
if i < j and fuzz.ratio(input_list[i], input_list[j]) >= 90:
input_list[i] = input_list[j]
return input_list
wanted = ['Agustin Dellagiovan']
df['Name'] = func(df['Name'].to_list() + wanted)[: -len(wanted)]
这将把所有类似的项目重命名为相同的项目。如果你创建了你想要的名字列表(所有的名字都是正确的。我不知道你将如何决定(,那么所有的名字应该改为那些(如果它们足够相似的话(。