计算来自不同行的两个坐标之间的距离

Compute the distance between two coordinates from different rows

我想在数据框中创建一个新列,其中包含当前交易位置与上次交易位置之间的距离。

我有每个位置的纬度和经度,并使用半正弦公式计算两个坐标之间的距离。

def haversine(lat1, lon1, lat2, lon2):

    lon1, lat1, lon2, lat2 = map(np.radians, [lon1, lat1, lon2, lat2])

    dlon = lon2 - lon1
    dlat = lat2 - lat1

    a = np.sin(dlat / 2.0) ** 2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon / 2.0) ** 2

    c = 2 * np.arcsin(np.sqrt(a))
    km = 6367 * c # Radius of earth in kilometers. (Use 3956 for miles)
return km

但是,我正在尝试对其进行调整,以便它计算与最后一行(即先前位置)的差异:

for i in range(0,df.shape[0]-1):
    df['Dist_last_trans'] = \
        haversine(df['merch_lat'].iloc[i-1], df['merch_long'].iloc[i-1],
                     df['merch_lat'].iloc[i], df['merch_long'].iloc[i])
   

但是每一行的输出都是一样的,这显然是错误的。

如有任何帮助,我们将不胜感激。

我已经用玩具数据框复制了你的案例。问题是您在分配期间没有指定行。这会导致列范围的赋值,它会修改所有行的 Diff_last_trans 列。

>>> import pandas as pd
>>> data = [['Alex',10],['Bob',12],['Clarke',13]]
>>> df = pd.DataFrame(data,columns=['Name','Diff_last_trans'])
>>> df['Diff_last_trans']
0    10
1    12
2    13
Name: Diff_last_trans, dtype: int64
>>> df['Diff_last_trans'] =3
>>> df['Diff_last_trans']
0    3
1    3
2    3
Name: Diff_last_trans, dtype: int64

尝试用

指定行索引
>>> df.loc[1]['Diff_last_trans'] = 2
>>> df['Diff_last_trans']
0    3
1    2
2    3

在您的情况下,这将用作

df.loc[i]['Diff_last_trans'] = \
        haversine(df['merch_lat'].iloc[i-1], df['merch_long'].iloc[i-1],
                     df['merch_lat'].iloc[i], df['merch_long'].iloc[i])