Pythonic方法获取数据帧中每个点的最近点(最近邻)

时间:2014-02-17 12:24:49

标签: python loops pandas nearest-neighbor

我有一个地点和塔楼列表。我试图找出每个位置最近的塔是什么。我想出了一种有效的方法,但我很确定这是一种非常低效的方法。

我将如何以更加pythonic的方式做到这一点?

我有大约4,000个地点和11,000个塔楼。我现在:

  1. 循环遍历每个位置
  2. 找到所有塔楼的距离
  3. 按距离排序
  4. 取最近的一个,然后将其附加到'nearest_tower'数据框。
  5. 以下是代码:

    nearest_tower = pd.DataFrame()
    
    for i, location_rows in d[["Name", "Lat", "Long"]].T.iteritems():
        tower_coords["Distance_km"] =  tower_coords.apply(lambda row: distance_on_unit_sphere(location_rows ["Lat"], location_rows ["Long"], row['DIGITAL_LATITUDE'], row['DIGITAL_LONGITUDE'])*6373, axis=1)
        a = tower_coords.sort(['Distance_km'], ascending = 1)[:1][["SITE_NUMBER", "DIGITAL_LATITUDE", "DIGITAL_LONGITUDE", "Distance_km"]]
        a["Location_Name"] = location_rows ["Name"]
        a["Location_Lat"] = location_rows ["Lat"]
        a["Location_Long"] = location_rows ["Long"]
        nearest_tower = nearest_tower.append(a)
        print(i)
    

    Tower_coords看起来像这样:

    SITE_NUMBER    DIGITAL_LATITUDE      DIGITAL_LONGITUDE
    1                67.21                     -30.432
    ...
    

2 个答案:

答案 0 :(得分:1)

首先,使用minPython doc here)找到最近的。你可以在iterable之后提供一个key参数(这将是你的lambda函数)。

使用类而不是类似Hash的结构而不是a对象更加pythonic。像PyPy这样的实现在处理类属性访问方面比在类似哈希的访问方面更有效。

这整个功能可以做成map操作。您正在使用一个结构并将其映射到另一个结构,并且元素之间具有1-1对应关系,这使其成为map

最后(这不是Pythonic,但重要的是),你应该使用k-d tree结构来有效地找到最近的点。

答案 1 :(得分:0)

编辑:有人在这里解释了Pandas中的how to do a k-d tree search

Here is a solution在另一个利用复杂数据类型(内置于Python和Numpy)中的问题,它比循环更快但使用大量内存。

Pandas Github proposing a get_nearest method中存在一个问题,它会像@Hbcdev那样进行k-d树搜索。 我自己想弄清楚如何在Pandas中实现kNN搜索。