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

问题描述 投票:2回答:2

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

我怎么能以更加pythonic的方式做到这一点?

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

  1. 循环遍历每个位置
  2. 找到所有塔的距离
  3. 按距离排序
  4. 取最近的一个然后将其附加到'nearest_tower'数据帧。

这是代码:

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
...
python loops pandas nearest-neighbor
2个回答
1
投票

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

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

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

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


0
投票

编辑:有人在熊猫解释how to do a k-d tree search

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

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

© www.soinside.com 2019 - 2024. All rights reserved.