Python pandas应用太慢的模糊匹配

时间:2017-11-10 16:47:57

标签: python pandas merge apply data-cleaning

def fuzzy_clean(i, dfr, merge_list, key):  
    for col in range(0,len(merge_list)):
        if col == 0:
            scaled_down = dfr[dfr[merge_list[col]]==i[merge_list[col]]]
        else:
            scaled_down = scaled_down[scaled_down[merge_list[col]]==i[merge_list[col]]]
    if len(scaled_down)>0:
        if i[key] in scaled_down[key].values.tolist():
            return i[key]
        else:
            return pd.to_datetime(scaled_down[key][min(abs([scaled_down[key]-i[key]])).index].values[0])
    else:
        return i[key]

df[key]=df.apply(lambda i: fuzzy_clean(i,dfr,merge_list,key), axis=1)

我试图最终将两个数据帧dfr和df合并在一起。我遇到的问题是我需要合并大约9列,其中一列是两个数据帧之间并不完全匹配的时间戳,有时它稍微滞后,有时会领先。我编写了一个在使用以下内容时起作用的函数;然而,在实践中,运行数十万行的速度太慢。

merge_list是每个匹配100%

的数据框共享的列的列表

键是一个列的字符串,'时间戳',每个共享,这是不匹配的

任何加快这一点的建议都将非常感谢!

    The data looks like the following:
    df:
       timestamp   A   B   C
    0  100         x   y   z   
    1  101         y   i   u
    2  102         r   a   e
    3  103         q   w   e

    dfr:
       timestamp   A   B   C
    0  100.01      x   y   z   
    1  100.99      y   i   u
    2  101.05      y   i   u
    3  102         r   a   e
    4  103.01      q   w   e
    5  103.20      q   w   e

    I want df to look like the following:
       timestamp   A   B   C
    0  100.01      x   y   z    
    1  100.99      y   i   u
    2  102         r   a   e
    3  103.01      q   w   e

添加最终合并以供参考:

def fuzzy_merge(df_left, df_right, on, key, how='outer'):
    df_right[key]=df_right.apply(lambda i: fuzzy_clean(i,df_left,on,key), axis=1)
    return pd.merge(df_left, df_right, on=on+[key], how=how, indicator=True).sort_values(key)

1 个答案:

答案 0 :(得分:0)

我找到了一个我相信有效的解决方案。 Pandas有一个merge_asof紧随其后,仍在验证可能的重复计算,但似乎做得不错。

pd.merge_asof(left_df, right_df, on='timestamp', by=merge_list, direction='nearest')