2014-02-17 109 views
1

我有一個位置和塔的列表。我試圖找出每個位置最接近的塔樓。我想出了一種可行的方式,但我確信這是一種非常低效的方式。Pythonic方式獲得數據框中每個點的最近點(最近鄰居)

我該如何以更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 
... 
+0

什麼是tower_coords?這是什麼樣子? – usethedeathstar

+0

如果將本地塔的距離放在堆中,可能會彈出最近的塔。但可能還有更高效的數據結構來解決這個問題,比如kd tree @Hbcdev提到 –

+0

@usethedeathstar文件添加的例子,它只是顯示了一個塔的經度和緯度 – Ger

回答

1

先上去,用minPython doc here)找到最近的。你可以在iterable之後提供一個key參數(這將是你的lambda函數)。

使用一個類代替哈希結構而不是你的a對象會更加pythonic。像PyPy這樣的實現將比使用類似散列的訪問更有效地處理類屬性訪問。

這個整個功能可以做成map操作。您正在採取一種結構並將其映射到另一個結構中,元素之間具有1-1對應關係,這使得它成爲map

最後(這不是關於Pythonic,但它很重要),您應該使用k-d tree結構來有效地找到最近的點。

0

Here is a solution在另一個問題中,它利用了比循環更快但使用大量內存的複雜數據類型(Python和Numpy中的內置函數)。

在Pandas Github proposing a get_nearest method中存在一個問題,該問題將會像上面提到的@Hbcdev那樣進行k-d樹搜索。 我自己想弄清楚如何在熊貓中實現kNN搜索。

編輯:有人在熊貓在這裏解釋how to do a k-d tree search