在这个答案中,您将找到两个潜在的选项:
1.选项1,使用我在
这里的答案中创建的函数。在那个答案中,您将找到其他可以使用的方法。
2.选项2,使用不同的函数。
为了测试目的,即使我建议尽可能接近您将要使用的数据进行测试,我也将采用由@Qdr提出的
示例。
import pandas as pd
import numpy as np
import random as rn
data = [[rn.randint(1, 10), rn.randint(1, 10)] for x in range(9)]
users = ['user1', 'user2', 'user3'] * 3
rn.shuffle(users)
df1 = pd.DataFrame(data, columns=['x', 'y'], index=users)
选项1
为了测量两点之间的距离(由地理坐标表示),如我上面所提到的,可以使用我在这里分享的函数之一,其中我们将找到更好的解释。
该函数称为haversine
,受Haversine公式的启发而来。
def haversine(lon1, lat1, lon2, lat2):
"""
Calculate the great-circle distance (in km) between two points
using their longitude and latitude (in degrees).
"""
r = 6371.0
lat1 = radians(lat1)
lon1 = radians(lon1)
lat2 = radians(lat2)
lon2 = radians(lon2)
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2
c = 2 * atan2(sqrt(a), sqrt(1 - a))
return r * c
由于我们想要最大距离,因此让我们创建一个使用先前函数的函数。
def max_distance(lat1, lon1, lat2, lon2):
distance = haversine(lon1, lat1, lon2, lat2)
return np.max(distance)
最后,可以创建一个新的数据框
df2
。
[In]: df2 = df1.groupby(df1.index).apply(lambda x: pd.Series({'max_distance': max_distance(x['x'].iloc[0], x['y'].iloc[0], x['x'].iloc[1], x['y'].iloc[1])}))
[Out]: max_distance
user1 866.714728
user2 867.428750
user3 247.358878
选项2
根据需求,以下函数也可以用于计算两点之间的最大距离,假设想要计算最大距离,则使用以下函数即可。
def max_distance(lat1, lon1, lat2, lon2):
distance = np.sqrt((lat1 - lat2)**2 + (lon1 - lon2)**2)
return np.max(distance)
为了创建一个新的数据框,按照用户进行分组(在这个例子中,使用数据框
df1
的索引),其中包含一个名为
max_dist_km
的列,该列将具有给定用户之间的最大距离(使用前面的函数),应执行以下操作。
df2 = df1.groupby(df1.index).apply(lambda x: pd.Series({'max_distance': max_distance(x['x'].iloc[0], x['y'].iloc[0], x['x'].iloc[1], x['y'].iloc[1])}))