【问题标题】:calculate distance between two geocodes in a dataframe计算数据框中两个地理编码之间的距离
【发布时间】:2021-04-20 12:47:17
【问题描述】:

需要使用此数据框(名为 df)的半正弦距离来获取 lat long 对的距离。要求是在同一数据框 (df) 的新列中添加距离。

Name geo1 geo2
ABC (52.2296756,21.0122287) (51.3490756,23.0922287)
XYZ (52.3490756,23.0922287) (51.2296756,21.0122287)

【问题讨论】:

    标签: python pandas haversine


    【解决方案1】:

    如果你参考这个Python's implementation of haversine distance:

    df["distance"] = df[["geo1", "geo2"]].apply(lambda x: haversine(*x.geo1, *x.geo2), axis="columns")
    
    >>> df
      Name                      geo1                      geo2    distance
    0  ABC  (52.2296756, 21.0122287)  (51.3490756, 23.0922287)  248.451222
    1  XYZ  (52.3490756, 23.0922287)  (51.2296756, 21.0122287)  258.456800
    

    【讨论】:

      【解决方案2】:

      这也很有效

      #splitting lat longs
      split_data = df.geo1.strip(')').str.strip('(').str.split(',')
      df['geo1_lat'] = split_data.apply(lambda x: x[0])
      df['geo1_long'] = split_data.apply(lambda x: x[1])
      
      split_data = df.geo2.strip(')').str.strip('(').str.split(',')
      df['geo2_lat'] = split_data.apply(lambda x: x[0])
      df['geo2_long'] = split_data.apply(lambda x: x[1])
      
      def haversine_distance(lat1, lon1, lat2, lon2):
         r = 6371
         phi1 = np.radians(lat1)
         phi2 = np.radians(lat2)
         delta_phi = np.radians(lat2 - lat1)
         delta_lambda = np.radians(lon2 - lon1)
         a = np.sin(delta_phi / 2)**2 + np.cos(phi1) * np.cos(phi2) *   np.sin(delta_lambda / 2)**2
         res = r * (2 * np.arctan2(np.sqrt(a), np.sqrt(1 - a)))
         return np.round(res*1000, 2)
      
      df['distance'] = df[['geo1_lat','geo1_long','geo2_lat','geo2_long']].apply(lambda x: haversine(x[1], x[0], x[3], x[2]), axis=1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        • 2018-10-05
        • 2016-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多