计算两个DataFrame之间的最小距离

时间:2013-11-08 20:40:39

标签: python pandas distance minimum

我喜欢在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。

2 个答案:

答案 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])

如果考虑速度,请运行性能测试。