用两个if条件python的两行替换迭代循环

时间:2018-11-30 06:14:35

标签: python python-3.x pandas for-loop

我有以下代码,我正在使用循环进行进一步的操作。

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的函数来计算这四个变量的值,并在代码中写入最后一个条件并将其附加到列表中。

当数据帧的大小很大时,我想替换循环,因为它执行时间太长。

如何无循环执行,它可以更快地执行

1 个答案:

答案 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))