Python无法应用太慢的模糊匹配

Python无法应用太慢的模糊匹配,python,pandas,merge,apply,data-cleaning,Python,Pandas,Merge,Apply,Data Cleaning,我试图最终合并两个数据帧,dfr和df。我遇到的问题是,我需要在大约9列上进行合并,其中一列是两个数据帧之间不完全匹配的时间戳,有时稍微滞后,有时超前。我编写了一个函数,在使用以下命令时可以工作:;然而,实际上,它在数十万行中运行太慢了 merge_list是一个列列表,每个数据帧共享的列匹配率为100% 键是一个列“timestamp”的字符串,每个共享都有一个,这是不匹配的 任何加快这一进程的建议都将不胜感激 def fuzzy_clean(i, dfr, merge_list, key):

我试图最终合并两个数据帧,dfr和df。我遇到的问题是,我需要在大约9列上进行合并,其中一列是两个数据帧之间不完全匹配的时间戳,有时稍微滞后,有时超前。我编写了一个函数,在使用以下命令时可以工作:;然而,实际上,它在数十万行中运行太慢了

merge_list是一个列列表,每个数据帧共享的列匹配率为100%

键是一个列“timestamp”的字符串,每个共享都有一个,这是不匹配的

任何加快这一进程的建议都将不胜感激

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)
添加最终合并以供参考:

    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

我找到了一个我认为有效的解决方案。熊猫有一个合并asof如下,仍然验证可能的重复计数,但似乎做得不错

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)

我找到了一个我认为有效的解决方案。熊猫有一个合并asof如下,仍然验证可能的重复计数,但似乎做得不错

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)

如果不先提供一些样本数据,就很难遵循这个逻辑,并重新处理这个问题,使其更新为包含一些样本数据。为什么不能将时间戳舍入?然后在9列上合并dfr的时间戳在以后的程序中很重要。我需要把它控制在毫秒以下。另外,它会将两个不同的条目与它们的显示速度合并。对,创建另一个列,比如说
['timestamp2']
,它有四舍五入的值,然后合并并保存十进制值如果不先提供一些示例数据,很难遵循这个逻辑,重新处理这个问题,使其更新为包含一些样本数据,为什么不能将时间戳舍入?然后在9列上合并dfr的时间戳在以后的程序中很重要。我需要把它控制在毫秒以下。另外,它会将两个不同的条目与它们的显示速度合并在一起。右,创建另一个列,比如说
['timestamp']
,该列有四舍五入的值,然后在该列上合并并保存十进制值您可能需要左_df.sort_值('timestamp')和右_df.sort_值('timestamp'),您可能需要左_df.sort_值('timestamp')和右方向排序值('timestamp'))