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)
答案 0 :(得分:0)
我找到了一个我相信有效的解决方案。 Pandas有一个merge_asof紧随其后,仍在验证可能的重复计算,但似乎做得不错。
pd.merge_asof(left_df, right_df, on='timestamp', by=merge_list, direction='nearest')