我有以下代码,我正在使用循环进行进一步的操作。
for i in range(0,(len(dff1)-1)):
lat1=dff1.latitude.values[i]
lon1=dff1.longitude.values[i]
lat2=dff1.latitude.values[i+1]
lon2=dff1.longitude.values[i+1]
if((lat1!=0)&(lon1!=0)&(lat2!=0)&(lon2!=0)):
a=(lat1,lon1)
b=(lat2,lon2)
s=i
dist.append(great_circle(a,b).meters)
elif((lat1==0)&(lon1==0)&(lat2==0)&(lon2==0)):
dist.append(0)
elif((lat1!=0)&(lon1!=0)&(lat2==0)&(lon2==0)):
dist.append(0)
elif((lat1==0)&(lon1==0)&(lat2!=0)&(lon2!=0)):
pp=list(range(s,i+1))
lst=[]
for y in pp:
lst.append(dff1.latitude.values[y])
ls = [z for z, e in enumerate(lst) if e != 0]
lst1=[]
for q in pp:
lst1.append(dff1.longitude.values[q])
ls = [z for z, e in enumerate(lst) if e != 0]
ls1 = [z for z, e in enumerate(lst1) if e != 0]
lat1=lst[ls[-1]]
lon1=lst1[ls[-1]]
a=(lat1,lon1)
b=(lat2,lon2)
dist.append(great_circle(a,b).meters)
我正在存储每行及其前一行的经纬度,我将得到4个变量,即lat1,lon1,lat2,lon2,现在我使用的条件是,如果所有变量的值均为零,则追加0,像这样我有4个条件,并使用另一个名为great_circle的函数来计算这四个变量的值,并在代码中写入最后一个条件并将其附加到列表中。
当数据帧的大小很大时,我想替换循环,因为它执行时间太长。
如何无循环执行,它可以更快地执行
答案 0 :(得分:0)
因此,如果我对您的理解正确,则您有一个经度和纬度的数据框,并且想要计算到下一行中的经纬度的距离,并将该值存储为距离。
虚拟数据框:
df = pd.DataFrame({'Long':[-2986.242495,-3383.296608,0,0],'Lat':[-880.627428,-2559.748913,0,0]})
df
Lat Long
-880.627428 -2986.242495
-2559.748913 -3383.296608
0.000000 0.000000
0.000000 0.000000
您无需像在i2中将i + 1分配给lat2和long2那样进行循环,而是只需移动数据框并将值存储到下面的新列中即可
df[['Long_2','Lat_2']] = df[['Long','Lat']].shift(-1)
df
Lat Long Long_2 Lat_2
-880.627428 -2986.242495 -3383.296608 -2559.748913
-2559.748913 -3383.296608 0.000000 0.000000
0.000000 0.000000 0.000000 0.000000
0.000000 0.000000 NaN NaN
然后我们可以创建一个Distance列,将None设置为默认值,将所有列均为0的值设置为0
df['Distance'] = None
df.loc[(df.Lat==0) & (df.Long==0) & (df.Lat_2==0) & (df.Long_2==0),'Distance'] = 0
所有列都不为0时,我们使用距离公式来计算距离
df.loc[df.Distance!=0,'Distance'] = sphere_dist(df.loc[df.Distance!=0,'Lat'],df.loc[df.Distance!=0,'Long'],df.loc[df.Distance!=0,'Lat_2'],df.loc[df.Distance!=0,'Long_2'])
现在我们有了一个数据框,其结果是(希望)在距离列中
df
Lat Long Long_2 Lat_2 Distance
-880.627428 -2986.242495 -3383.296608 -2559.748913 12400
-2559.748913 -3383.296608 0.000000 0.000000 14239.1
0.000000 0.000000 0.000000 0.000000 0
0.000000 0.000000 NaN NaN NaN
我在这里使用的公式是
def sphere_dist(pickup_lat, pickup_lon, dropoff_lat, dropoff_lon):
"""
Return distance along great radius between first and second coordinates.
"""
#Define earth radius (km)
R_earth = 6371
#Convert degrees to radians
pickup_lat, pickup_lon, dropoff_lat, dropoff_lon = map(np.radians,
[pickup_lat, pickup_lon,
dropoff_lat, dropoff_lon])
#Compute distances along lat, lon dimensions
dlat = dropoff_lat - pickup_lat
dlon = dropoff_lon - pickup_lon
#Compute haversine distance
a = np.sin(dlat/2.0)**2 + np.cos(pickup_lat) * np.cos(dropoff_lat) * np.sin(dlon/2.0)**2
return 2 * R_earth * np.arcsin(np.sqrt(a))