假設我有以下數據幀:
# data frame circles
ID x y
1 4 5
2 5 6
# data frame points
ID x y
1 2 1
2 1 2
我要檢查每個點是否都位于每個圓內。如果點位于圓內(根據一些計算),則獲取圓的ID并將其保存在單獨的列表中
# output of the list (ID of the circles)
[1]
[1 2]
這意味著point 1
位于圓1內,point 2
位于兩個圓中。
現在,我編寫了以下函數來完成定位工作。
for i in range(len(points)):
for j in range(len(circles)):
get_point_coordinates = (points.loc[i].at["x"], points.loc[i].at["y"])
get_circle_coordinates = (circles.loc[j].at["x"], circles.loc[j].at["y"])
### calling library's function to calculate
distance = distance.great_circle(get_point_coordinates, get_circle_coordinates ).km
if distance <= 5:
list[i].append(circles.loc[j].at["ID"])
這是一個嵌套循環,用于迭代每個點并逐個檢查所有圓。
問題是:原始數據幀超過100000行,因此需要永遠迭代。
我讀了一些關于使用apply
處理海量數據的帖子。因此,我嘗試了以下方法,但沒有奏效(錯誤:Series的真值不明確)。
for i in range(len(circles)):
newlist = newDataFrame['result'].apply(get_distance_function(circles.loc[i].at["x"], circles.loc[i].at["y"], points['x'], points['y']))
但我認為這仍然是一個問題,因為我只去掉了內部for循環,我仍然需要迭代100000次,而不是100000*100000次
那么,有什么更好的主意嗎?或者這種方法是最短的,我應該糾正錯誤?
為了得到(點、圓)的所有組合,我們可以進行交叉連接。
這樣,我們可以在每行級別將一個點與一個圓進行比較。我們在行級別使用
apply
(axis=1
)。計算距離并將其添加為新列。通過該距離,我們可以檢查它是否在半徑范圍內(在本例中設置為5),并將
ID_point
按ID_circle
分組,使其成為一個列表。