我有两个数据处理程序,比如A和B,它们有一些列名为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我目前的方法很慢,是基于比较每一行A和每一行B,但是代码也不清楚,因为我必须为合并保留索引,我一点也不满意,但我想不出一个更好的解决方案。
我如何才能执行上述合并使用熊猫?这里有什么方便的方法或功能可以帮助吗?
编辑:为了澄清,在数据中也有其他列,它们不在距离计算中使用,但也必须合并。
发布于 2017-04-19 10:03:07
可以这样做的一种方法是:
A = pd.DataFrame({'attr1':[10,20,30]})
B = pd.DataFrame({'attr1':[15,15,27]})使用交叉连接获取所有组合
1.2+大熊猫的更新使用方式=‘交叉’
merge_AB = A.merge(B, how='cross', suffixes = ('_A', '_B'))老熊猫版本使用psuedo键..。
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 27https://stackoverflow.com/questions/43491342
复制相似问题