我喜欢在DF1中找到DF2的项目。
距离是欧氏距离。
例如,对于DF1中的A,DF2中的F是cloeset。
>>> 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)
这很好用,大数据集需要很长时间。
另一个问题是如何找到第二和第三个cloeset。
答案 0 :(得分:1)
查看scipy.spatial.KDTree和相关的cKDTree,它更快但只提供了一部分功能。对于大型套装,你可能不会为了速度而击败它。
答案 1 :(得分:1)
有多种方法,例如可以使用numpy:
>>> xy = ['X', 'Y']
>>> distance_array = numpy.sum((df1[xy].values - df2[xy].values)**2, axis=1)
>>> distance_array.argmin()
1
前三名最接近(不是最快的方法,我想,但最简单)
>>> distance_array.argsort()[:3]
array([1, 3, 2])
如果考虑速度,请运行性能测试。