我喜欢在 DF2 中找到与 DF1 中的项目最接近的项目。
距离为欧式距离。
例如,对于 DF1 中的 A,DF2 中的 F 是壁橱。
>>> DF1
X Y name
0 1 2 A
1 3 4 B
2 5 6 C
3 7 8 D
>>> DF2
X Y name
0 3 8 E
1 2 4 F
2 1 9 G
3 6 4 H
我的代码是
DF1 = pd.DataFrame({'name' : ['A', 'B', 'C', 'D'],'X' : [1,3,5,7],'Y' : [2,4,6,8]})
DF2 = pd.DataFrame({'name' : ['E', 'F', 'G', 'H'],'X' : [3,2,1,6],'Y' : [8,4,9,4]})
def ndis(row):
try:
X,Y=row['X'],row['Y']
DF2['DIS']=(DF2.X-X)*(DF2.X-X)+(DF2.Y-Y)*(DF2.Y-Y)
temp=DF2.ix[DF2.DIS.idxmin()]
return temp[2] # print temp[2]
except:
pass
DF1['Z']=DF1.apply(ndis, axis=1)
这很好用,但对于大数据集来说会花费太长时间。
另一个问题是如何找到第二个和第三个衣橱。
最佳答案
方法不止一种,例如可以使用numpy:
>>> xy = ['X', 'Y']
>>> distance_array = numpy.sum((df1[xy].values - df2[xy].values)**2, axis=1)
>>> distance_array.argmin()
1
前 3 个最接近(我想这不是最快的方法,但最简单)
>>> distance_array.argsort()[:3]
array([1, 3, 2])
如果速度是一个问题,运行性能测试。
关于python - 计算两个数据帧之间的最小距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19868136/