我的列中包含可能包含拼写错误的城市名称。
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
myst="""1 Mumbai
2 Delhi
3 Delhi
4 Mumbai
5 Mumbai
6 Delhi
7 Dolhi
"""
u_cols=['customer_id', 'city']
myf = StringIO(myst)
import pandas as pd
df = pd.read_csv(StringIO(myst), sep=' ', names = u_cols)
当我按城市分组时,我可以看到错误的拼写...
df['city'].value_counts()
Delhi 3
Mumbai 3
Dolhi 1
我可以使用像这样的替换方法轻松纠正它......
df.replace({'Dolhi': 'Delhi'})['city'].value_counts()
但是没有办法知道可能的拼写错误。如果有2个相似的单词,则计数较高的单词被认为是正确的。所以在这种情况下,"德里"是正确的" Dolhi"是错的。 是否可以应用任何此类"情报"这个数据帧数据?
答案 0 :(得分:2)
您可以计算每对城市之间的Levenshtein distance,这是两个字符串相似度的度量。基本上,将字符串转换为另一个字符串(例如,更改字符或添加/删除字符)所需的每个更改都会将Levenshtein距离增加1。 nltk
包中包含edit_distance()
函数,该函数返回Levenshtein距离。
您可以使用itertools.combinations()
遍历所有唯一城市对,并检查Levenshtein距离是否低于某个魔术阈值,例如:此示例中为1
。请注意,此阈值需要一些手动调整才能合并不同的城市名称,同时仍能捕获所有拼写错误。
然后,您可以通过比较数据集中使用它们的频率,找到正确的名称(下面的main_name
)和错误的名称(下面的mistake
)。当然,假设人们在大多数时间都会正确地写出城市名称。
import itertools
from nltk.metrics import edit_distance
MAGIC_THRESHOLD = 1
city_names = df['city'].value_counts()
for name_a, name_b in itertools.combinations(city_names.index, 2):
if edit_distance(name_a, name_b) <= MAGIC_THRESHOLD:
count_a, count_b = city_names[name_a], city_names[name_b]
main_name, mistake = (name_a, name_b) if count_a > count_b else (name_b, name_a)
df = df.replace({mistake: main_name})
print(df['city'].value_counts())
结果给了我们:
Delhi 4
Mumbai 3