根据最近的值合并pandas数据帧

时间:2017-04-19 09:14:29

标签: python pandas

我有两个数据框,比如AB,其中包含一些名为attr1attr2attrN的列。

我有一定的距离度量,我想合并数据帧,这样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

我目前这样做的方式很慢,并且基于将A的每一行与B的每一行进行比较,但代码也不清楚,因为我必须保留合并的索引和我我根本不满意,但我无法想出更好的解决方案。

如何使用pandas执行上述合并?有没有方便的方法或功能在这里有用?

编辑:只是为了澄清,在数据框中还有其他列未用于距离计算,但也必须合并。

1 个答案:

答案 0 :(得分: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