2017-04-19 76 views
4

我有兩個數據幀,說AB,有一些列名爲attr1,attr2,attrN基於最近值合併熊貓數據幀

我有一定的距離測量,我想合併數據幀,使A中的每一行與B中具有最短距離屬性之間的行合併。請注意,合併時可以重複B中的行。

例如(有一個屬性讓事情變得簡單),使用絕對差距離|A.attr1 - B.att1|

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

應該產生以下合併表

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

我做的電流的方式合併這兩個表這是緩慢的,並且基於比較每行AB的每一行,但代碼也不明確,因爲我必須保留用於合併的索引並且我根本不滿意,但是我可以沒有拿出更好的解決方案。

如何使用熊貓來執行上述合併?有沒有任何方便的方法或功能可以幫助您?

編輯:只是爲了澄清,在數據框中還有其他列沒有用於距離計算,但也必須合併。你可以做到這一點如下

回答

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