【发布时间】:2020-03-13 05:51:44
【问题描述】:
我在数据框中有一列是这样的:
OWNER
--------------
OTTO J MAYER
OTTO MAYER
DANIEL J ROSEN
DANIEL ROSSY
LISA CULLI
LISA CULLY
LISA CULLY
CITY OF BELMONT
CITY OF BELMONT CITY
我的数据框中的某些名称拼写错误或有多余/缺失的字符。我需要一个列,其中名称被同一列中的任何紧密匹配替换。但是,所有相似的名称都需要按一个相同的名称进行分组。
例如,这是我对上面数据框的期望:
NAME
--------------
OTTO J MAYER
OTTO J MAYER
DANIEL J ROSEN
DANIEL ROSSY
LISA CULLY
LISA CULLY
LISA CULLY
CITY OF BELMONT
CITY OF BELMONT
OTTO MAYER 被 OTTO J MAYER 取代,因为它们非常相似。 DANIEL 保持不变,因为它们不匹配。 LISA CULL 都有相同的值等等。
我从另一篇关于堆栈溢出的帖子中获得了一些代码,该帖子试图解决类似的问题,但他们使用的是名称字典。但是,我在修改他们的代码以产生我需要的输出时遇到了麻烦。
这是我目前拥有的:
d = pd.DataFrame({'OWNER' : pd.Series(['OTTO J MAYER', 'OTTO MAYER','DANIEL J ROSEN','DANIEL ROSSY',
'LISA CULLI', 'LISA CULLY'])})
names = d['OWNER']
names = names.values
names
import difflib
def best_match(tokens, names):
for i,t in enumerate(tokens):
closest = difflib.get_close_matches(t, names, n=1)
if len(closest) > 0:
return i, closest[0]
return None
def fuzzy_replace(x, y):
names = y # just a simple replacement list
tokens = x.split()
res = best_match(tokens, y)
if res is not None:
pos, replacement = res
return u" ".join(tokens)
return x
d["OWNER"].apply(lambda x: fuzzy_replace(x, names))
【问题讨论】:
标签: python regex pandas fuzzy-comparison difflib