根据python中的lat long、groupby 2字段计算距离

根据python中的lat long、groupby 2字段计算距离,python,pandas,dataframe,distance,spyder,Python,Pandas,Dataframe,Distance,Spyder,我的车辆跟踪系统有一组数据,需要我根据lat和long计算距离。了解使用哈弗森公式可以帮助获得行之间的距离,但我有点结巴,因为我需要基于2个字段(模型类型和模式)的距离 下面是我的代码: def haversine(lat1,lon1,lat2,lon2, to_radians = True, earth_radius =6371): if to_radians: lat1,lon1,lat2,lon2 = np.radians([lat1,lon1,lat2,lon2]

我的车辆跟踪系统有一组数据,需要我根据lat和long计算距离。了解使用哈弗森公式可以帮助获得行之间的距离,但我有点结巴,因为我需要基于2个字段(模型类型和模式)的距离

下面是我的代码:

def haversine(lat1,lon1,lat2,lon2, to_radians = True, earth_radius =6371):
    if to_radians:
        lat1,lon1,lat2,lon2 = np.radians([lat1,lon1,lat2,lon2])

    a = np.sin((lat2-lat1)/2.0)**2+ np.cos(lat1) * np.cos(lat2) * np.sin((lon2-lon1)/2.0)**2

    return earth_radius *2 * np.arcsin(np.sqrt(a))

mydataset = pd.read_csv(x + '.txt')
print (mydataset.shape)
mydataset = mydataset.sort_values(by=['Model','timestamp']) #sort
mydataset['dist'] = 
np.concatenate(mydataset.groupby(["Model"]).apply(lambda 
         x: haversine(x['Latitude'],x['Longitude'],
         x['Latitude'].shift(),x['Longitude'].shift())).values)
这样,我就能够基于模型(通过使用排序)计算行之间的距离

但我想更进一步,根据模式和模型进行计算。我的字段是“索引、模型、模式、Lat、Long、时间戳”

请指教

Index, Model, Timestamp, Long, Lat, Mode(denote as 0 or 2), Distance Calculated
1, X, 2018-01-18 09:16:37.070, 103.87772815, 1.35653496, 0, 0.0
2, X, 2018-01-18 09:16:39.071, 103.87772815, 1.35653496, 0, 0.0
3, X, 2018-01-18 09:16:41.071, 103.87772815, 1.35653496, 0, 0.0
4, X, 2018-01-18-09:16:43.071, 103.87772052, 1.35653496, 0, 0.0008481795
5, X, 2018-01-18 09:16:45.071, 103.87770526, 1.35653329, 0, 0.0017064925312804799
6, X, 2018-01-18 09:16:51.070, 103.87770526, 1.35653329, 2, 0.0
7, X, 2018-01-18 09:16:53.071, 103.87770526, 1.35653329, 2, 0.0
8, X, 2018-01-18 09:59:55.072, 103.87770526, 1.35652828, 0, 0.0005570865824842293

我需要它来计算模型的总行程距离以及模型在任何模式下的总行程距离

我认为需要添加
DataFrame
constructor以发挥作用,然后向
groupby
添加另一个列名,如
[“model”,“mode(表示为0或2)”]
[“model”,“mode”]
按列名称:

def haversine(lat1,lon1,lat2,lon2, to_radians = True, earth_radius =6371):
    if to_radians:
        lat1,lon1,lat2,lon2 = np.radians([lat1,lon1,lat2,lon2])

    a = np.sin((lat2-lat1)/2.0)**2+ np.cos(lat1) * np.cos(lat2) * np.sin((lon2- 
    lon1)/2.0)**2

    return pd.DataFrame(earth_radius *2 * np.arcsin(np.sqrt(a)))


mydataset['dist'] = (mydataset.groupby(["Model", "Mode(denote as 0 or 2)"])
                              .apply(lambda x: haversine(x['Lat'],
                                                         x['Long'], 
                                                         x['Lat'].shift(),
                                                         x['Long'].shift())).values)

#if need replace NaNs to 0  
mydataset['dist'] = mydataset['dist'].fillna(0)


我试着编辑我的groupby([“Model”,“Mode”]),但它不起作用。有人能帮我吗?你能添加一些数据样本吗?5,6行。如果不查看您的数据,很难进行评论,为什么您不能单独按模式分组,然后连接?嗨,使用数据更新,由于机密信息,我只能显示这些。我根据stackoverflow上的其他帖子做了这件事。由于我还是python新手,如果您能解释一下所使用的术语,我将不胜感激。很抱歉给您带来不便caused@ThanksForHelping您是否需要两个新的距离列,第一个是距离模式,第二个是距离模式?您好!谢谢你的回答!距离的计算不是问题。但我想按我不知道从何处开始的型号和模式对它们进行分组。@ThanksForHelping-解决方案已更改,请检查它。
print (mydataset)
   Index Model               Timestamp        Long       Lat  \
0      1     X 2018-01-18 09:16:37.070  103.877728  1.356535   
1      2     X 2018-01-18 09:16:39.071  103.877728  1.356535   
2      3     X 2018-01-18 09:16:41.071  103.877728  1.356535   
3      4     X 2018-01-18 09:16:43.071  103.877721  1.356535   
4      5     X 2018-01-18 09:16:45.071  103.877705  1.356533   
5      6     X 2018-01-18 09:16:51.070  103.877705  1.356533   
6      7     X 2018-01-18 09:16:53.071  103.877705  1.356533   
7      8     X 2018-01-18 09:59:55.072  103.877705  1.356528   

   Mode(denote as 0 or 2)  Distance Calculated      dist  
0                       0             0.000000  0.000000  
1                       0             0.000000  0.000000  
2                       0             0.000000  0.000000  
3                       0             0.000848  0.000848  
4                       0             0.001706  0.001706  
5                       2             0.000000  0.000557  
6                       2             0.000000  0.000000  
7                       0             0.000557  0.000000