【问题标题】:Fuzzy Match List with Column in a data frame数据框中带有列的模糊匹配列表
【发布时间】:2018-01-04 20:01:48
【问题描述】:

我有一个字符串列表,我试图将其与列中的值匹配。如果它是低匹配(低于 95),我想返回当前列值,如果它高于 95,那么我想从列表中返回最佳模糊匹配。我正在尝试将所有返回的值放入一个新列中。我不断收到错误“元组索引超出范围”,我认为这可能是因为它想返回一个带有分数和名称的元组,但我只想要名称。这是我当前的代码:

   from fuzzywuzzy import process
   from fuzzywuzzy import fuzz


   L = [ducks, frogs, doggies]

   df

   FOO    PETS
    a     duckz
    b     frags
    c     doggies

    def fuzz_m(column, pet_list, score_t):
        for c in column:
            new_name, score = process.extractOne(c, pet_list, score_t)
            if score<95:
                return c
            else:
                return new_name

    df['NEW_PETS'] = fuzz_m(df,L, fuzz.ratio)

期望的输出:

    FOO    PETS      NEW_PETS
    a     duckz       ducks
    b     frags       frogs
    c     doggies     doggies

【问题讨论】:

    标签: python string pandas match fuzzywuzzy


    【解决方案1】:

    几处更正。

    • 改变

      df['NEW_PETS'] = fuzz_m(df,L, fuzz.ratio)

    df['NEW_PETS'] = fuzz_m(df['PETS'], L, fuzz.ratio)
    
    • 将列表元素设为字符串。

    • Fuzzywuzzy 的 extractOne 方法按顺序接受处理器和记分器 (link to source code.)。 fuzz.ratio 的位置参数被错误地解释为处理器,而它实际上是一个得分手。将process.extractOne(c, pet_list, score_t) 更改为process.extractOne(c, pet_list, scorer=score_t)

    • 此基于循环的代码将无法按预期工作。 fuzz_m只被调用一次,其返回值会广播到df['NEW_PETS']系列的所有条目中。

    一种对熊猫更友好的方式:

    L = ['ducks', 'frogs', 'doggies']
    
    def fuzz_m(col, pet_list, score_t):
        new_name, score = process.extractOne(col, pet_list, scorer=score_t)
        if score<95:
            return col
        else:
            return new_name
    
    df['NEW_PETS'] = df['PETS'].apply(fuzz_m, pet_list=L, score_t=fuzz.ratio)
    

    【讨论】:

      猜你喜欢
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      相关资源
      最近更新 更多