我有一个具有经纬度和经度的数据框架(restaurants
)和一个具有经纬度和经度的邻域(area
)的数据框架。
我想针对每个社区计算3公里(numberR
)地区的餐馆数量。
我已经编写了以下代码,并且可以正常工作:
df=pd.DataFrame()
numberR=[]
radius=3
for element in range(0,area['lon'].count()): #for every neighborhood
df=pd.DataFrame()
df['destLat']=restaurants['lat']
df['originLat']=areas['lat'][element]
df['destLon']= restaurants['lng']
df['originLon']=area['lon'][element]
for i, row in df.iterrows():
#for every restaurant I compute the distance from my neighborhood in km
l=[haversine(df.originLon[i],df.originLat[i],df.destLon[i],df.destLat[i]) for i, row in df.iterrows()]
numberR.append(sum(x<radius for x in l))
但是,由于速度很慢,我想使代码更快。
您是否知道如何在更短的时间内达到相同的结果?
谢谢。
P.S。 haversine
是众所周知的函数,用于从lat和lng开始获取以千米为单位的距离。
答案 0 :(得分:1)
我建议您使用scipy.spacial.distance中的功能。
from scipy.spatial.distance import cdist
distances = cdist(areas, restaurants, metric=haversine) # metric accepts a callable
sum(distances > 3) # sums columns
cdist
函数计算两个DataFrame的每对行之间的距离。
此外,您还应该修改Haversine函数,使其能够接受DataFrame行。