我有一个带有纬度和经度的地点(restaurants
)的DataFrame和一个带有纬度和经度的邻里(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开始的以公里为单位的众所周知的距离函数。
发布于 2019-03-10 22:34:48
我建议您使用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
函数计算两个DataFrames的每对行之间的距离。
此外,您还应该修改haversine函数,使其能够接受DataFrame行。
https://stackoverflow.com/questions/55088080
复制相似问题