【问题标题】:Fuzzy match within the same column - Python同一列内的模糊匹配 - Python
【发布时间】:2020-05-29 12:16:19
【问题描述】:

问题:我在一列中有记录,例如。 Bulambuli和Bulambuli区基本相同。

解决方案:我试图在同一列中搜索一种模糊匹配,发现 -Pandas replace strings with fuzzy match in the same column:

import difflib 
import pandas as pd
df = pd.DataFrame({'district' : pd.Series(['Bulambuli', 'Kampla', 'Uttah' ,'Bulambuli district'])})
names = df['district']
def fuzzy_replace(x, names):
    aliases = difflib.get_close_matches(x, names)
    closest = pd.Series(aliases).mode()
    closest = aliases[0] if closest.empty else closest[0]
    df['district'].replace(aliases, closest, True)
df["district"].apply(lambda x: fuzzy_replace(x, df['district']))

结果:

你有过类似的问题吗?你会建议我如何处理它?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    输入:

    df = pd.DataFrame({'district' : pd.Series(['Bulambuli', 'Kampla', 'Uttah', 'Bulambuli district'])})
    df
        district
    0   Bulambuli
    1   Kampla
    2   Uttah
    3   Bulambuli district
    

    只返回最接近的:

    def fuzzy_replace(x, names):
        aliases = difflib.get_close_matches(x, names)
        closest = pd.Series(aliases).mode()
        closest = aliases[0] if closest.empty else closest[0]
        return closest
    
    df["district"].apply(lambda x: fuzzy_replace(x, df['district']))
    

    输出:

    0    Bulambuli
    1       Kampla
    2        Uttah
    3    Bulambuli
    

    函数返回字符串Bulambuli,因为它与df中的Bulambuli district最相似。

    【讨论】:

    • 感谢您的回复。然后,下一步是计算重复项?
    • 我以为你只是想用最接近的匹配替换 District 列中的字符串。你想达到什么目标?你想只保留一个出现的 Bulambuli 并丢弃另一个吗?
    • 我其实是想找到重复的。
    • 1. duplicated() 完全匹配; 2. 不,结果似乎没有意义,仍在检查中。
    • 代码的作用如下:对于df中的每一行(我们称之为x),fuzzy_replace函数在列区的所有值中寻找与x最接近的匹配。然后返回该匹配。例如,当 x='Bulambuli District' 时,该函数会发现 Bulambuli 是最近的,并返回它。这就是为什么 df 更新后的区列的第 3 行现在只有 Bulambuli。
    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    相关资源
    最近更新 更多