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)
私は最終的に2つのデータフレームdfrとdfを結合しようとしています。私が持っている問題は、約9列をマージする必要があることです。そのうちの1つはタイムマップで、2つのデータフレーム間ではあまり一致しません。私は、以下を使用するときに機能する関数を書いた。実際には、数十万行の実行が遅すぎます。Python pandasがあまりにも遅いファジーマッチを適用する
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)
最初のいくつかのサンプルデータを供給し、[MCVE] – DJK
は、いくつかのサンプルデータ –
なぜあなただけのタイムスタンプラウンドカントを含むように更新されるように、この質問を作り直すことなく、このロジックに従うようにそのハード? 9つの列をマージする – DJK