2017-11-10 17 views
1
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) 
+1

最初のいくつかのサンプルデータを供給し、[MCVE] – DJK

+0

は、いくつかのサンプルデータ –

+0

なぜあなただ​​けのタイムスタンプラウンドカントを含むように更新されるように、この質問を作り直すことなく、このロジックに従うようにそのハード? 9つの列をマージする – DJK

答えて

0

私は作品を信じて解決策を見つけました。パンダはそれに続くmerge_asofを持っていますが、それでも二重カウントの可能性を検証していますが、まともな仕事をしているようです。

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

left_df.sort_values( 'timestamp')とright_df.sort_values( 'timestamp')が必要な場合があります –

関連する問題