代码之家  ›  专栏  ›  技术社区  ›  EEPBAH

数据框中带列的模糊匹配列表

  •  0
  • EEPBAH  · 技术社区  · 7 年前

    我有一个试图与列中的值匹配的字符串列表。如果它是低匹配(低于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
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Peter Leimbigler    7 年前

    几处更正。

    • 改变

      df['NEW\u PETS']=fuzz\u m(df,L,fuzz.ratio)

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

    • 模糊模糊的 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)
    
    推荐文章