3

我喜欢找到最接近 DF1 中的项目的 DF2 项目。

距离是欧几里得距离。

例如,对于 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)

这很好用,对于大型数据集来说会花费很长时间。

另一个问题是如何找到 2nd 和 3d 壁橱。

4

2 回答 2

3

有不止一种方法,例如可以使用 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])

如果速度是一个问题,请运行性能测试。

于 2013-11-08T21:01:02.263 回答
2

查看scipy.spatial.KDTree和相关的 cKDTree,它更快但仅提供功能的子集。对于大型套装,您可能无法在速度上击败它。

于 2013-11-08T20:56:18.390 回答