【问题标题】:performance issues applying double lambda functions应用双 lambda 函数的性能问题
【发布时间】:2020-02-15 11:10:23
【问题描述】:

我有两个数据框:df1、df2,每个数据框都包含一个带有名称的列。我将 df1 中的每个名称与 df2 中的每个名称进行比较。 这必须是近似匹配。我正在使用fuzzywuzzy token_sort_ratio 来获得比较分数。

但是这种方法非常慢并且 df2 不断增长,它已经花费了半个小时以上(4k x 2k 行)。 有没有办法加快这个过程?

我目前的实现:

def match(df2,name):
    df2['score'] = df2['name'].map(lambda x: fuzz.token_sort_ratio(x, name))
        return df2.loc[(df2['score'].idxmax())

df1['result']=df1['name'].map(lambda x: match(df2,x))


【问题讨论】:

    标签: python pandas performance loops lambda


    【解决方案1】:

    你可以试试这个,

    from fuzzywuzzy import fuzz
    
    def similarity(name1, name2):
        return fuzz.token_sort_ratio(name1, name2)
    
    df1['key'] = 1
    df2['key'] = 1
    merged = df1.merge(df2, on='key')
    
    merged['name_score'] = merged[['name_x', 'name_y']] \
        .apply(lambda row: similarity(row['name_x'], row['name_y']), axis=1)
    

    或者,

    from fuzzywuzzy import fuzz
    
    def similarity(name1, name2):
        return fuzz.token_sort_ratio(name1, name2)
    
    df1['key'] = 1
    df2['key'] = 1
    merged = df1.merge(df2, on='key')
    
    scores = list(map(similarity, merged['name_x'], merged['name_y']))
    merged['name_score'] = scores
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多