2017-04-19 9 views
4

私はattr1という名前のいくつかの列を持つ2つのデータフレーム、ABを言う、attr2attrNを持っています。 の各行が属性間の最短距離を持つBの行とマージされるように、データフレームをマージしたいと思います。マージ時にBの行を繰り返すことができます。以下のマージされたテーブルにやってのマージパンダのデータフレーム(複数可)

M | attr1_A attr1_B 
0 | 10  15 
1 | 20  15 
2 | 30  27 

私の現在の方法が得られるはず絶対差の距離|A.attr1 - B.att1|

A | attr1  B | attr1 
0 | 10   0 | 15 
1 | 20   1 | 27 
2 | 30   2 | 80 

を使用して、これらの2つのテーブルをマージ

例えば

(1つの属性で物事をシンプルに保つために)、これは遅く、Aの各行とBの各行を比較することに基づいていますが、合併のためのインデックスを保持しなければならないためコードも明確ではありません。より良い解決策を思いつきません。

上記のようにpandasを使用してマージを実行するにはどうすればよいですか?ここで役立つ便利なメソッドや関数はありますか?

EDIT:データフレームには距離計算には使用されないが、併合されなければならない他の列もあります。次のようにあなたがそれを行うことができ

答えて

5

一つの方法:

A = pd.DataFrame({'attr1':[10,20,30]}) 
B = pd.DataFrame({'attr1':[15,15,27]}) 

すべての組み合わせ

A = A.assign(key=1) 
B = B.assign(key=1) 

merged_AB =pd.merge(A,B, on='key',suffixes=('_A','_B')) 

が今度はmerged_AB

で分の距離に
M = merged_AB.groupby('attr1_A').apply(lambda x:abs(x['attr1_A']-x['attr1_B'])==abs(x['attr1_A']-x['attr1_B']).min()) 

merged_AB[M.values].drop_duplicates().drop('key',axis=1) 
を見つけてみましょう得るために参加し、クロスのマージキーを作成します。

出力:

attr1_A attr1_B 
0  10  15 
3  20  15 
8  30  27 
+0

これを正しく取得したら、まずAのすべての行がBのすべての行で計算され、指定された条件に一致しない行が除外されます。確かに私のソリューションよりも読みやすく、ありがとう! – AkiRoss

+0

@AkiRossはい、AとBのデカルト積を作成し、フィルタリングする基準を使用します。 –

+0

非常に興味深い解決策! – MaxU

関連する問題