pandas 使用字符串匹配清理列值

j8ag8udp  于 2023-04-10  发布在  其他
关注(0)|答案(1)|浏览(120)

我有一个pandas列,里面有上千个公司名称值,一个名称可以有很多变化,但它最终引用的是同一个公司名称。我想用fuzzywuzzy做一些字符串匹配,它最终扫描每个值,并用匹配的字符长度最短的值替换它,但我不知道如何将其放入代码中。
下面是我希望得到的输出示例

company = ['Canopy Growth', 'Canopy Growth Chocolates', 'Canopy growTH', 'Aurora', 'Aurora Drift', 'Aurora Corp', 'Hexo Corp', 'HEXO', 'hexo Inc', 'Pure Sunfarms', 'Pure sunfarms Corp']

clean_company = ['Canopy Growth', 'Canopy Growth', 'Canopy Growth', 'Aurora', 'Aurora', 'Aurora', 'HEXO', 'HEXO', 'HEXO', 'Pure Sunfarms', 'Pure Sunfarms' ]

# create dataframe with company names
df = pd.DataFrame({'company': company, 'clean_company': clean_company})

df

任何帮助都非常感谢!

qvk1mo1f

qvk1mo1f1#

创建一个搜索空间,所有的名字…弹出第一个关闭,并检查每一个其他的名字相似使用fuzzywuzzy…任何是simillar足够(高于某个阈值)你可以用这个词分组,然后从搜索空间中删除……重复,直到搜索空间为空……我不认为你可以把它矢量化或任何酷的东西……这可能需要一段时间(取决于你的搜索空间有多大)。。。我想大概是下面这样的

def close_enough(group,word,threshold=0.9):
    if fuzzy.eval(group[0],word) > threshold:
       group.append(word)
       return True

def search_matches(words):
    groups = []
    while words:
        a_group = [words.pop(0)]
        words = [w for w in words if not close_enough(a_group,w)]
        # append this group sorted so smallest is first
        groups.append(sorted(a_group,key=len))
    # return our similar groups
    return groups
         

search_space = list(set(df['company'].str.lower()))
simillar_groups = search_matches(search_space)
print(simillar_groups)
# [[a,ab,...],[c,cn,..],]
mapper = {g[0]:v for g in simillar_groups for v in g}
df["normalized_names"] = df["company"].str.lower().map(mapper)
print(df)

相关问题