基于最近值合并Pandas数据框

5
我有两个数据框,分别为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个回答

11
你可以按照以下方式进行操作:

首先,你需要...

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

使用交叉连接获取所有组合

1.2+版本的pandas中使用how='cross'进行操作。

merge_AB = A.merge(B, how='cross', suffixes = ('_A', '_B'))

旧版本的Pandas使用伪关键字...

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

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

现在让我们找到合并_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

所以如果我理解正确,您首先计算A中每一行与B中每一行的乘积,然后过滤掉不符合给定条件的行。绝对比我的解决方案更易读,谢谢! - AkiRoss
@AkiRoss 是的,我创建了 A 和 B 的笛卡尔积,然后使用条件进行筛选。 - Scott Boston
1
非常有趣的解决方案! - MaxU - stand with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接