计算来自不同行的两个坐标之间的距离
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])
我想在数据框中创建一个新列,其中包含当前交易位置与上次交易位置之间的距离。
我有每个位置的纬度和经度,并使用半正弦公式计算两个坐标之间的距离。
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])