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