2017-04-19 80 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