【问题标题】:how to quickly calculate distance with pandas longitudes and latitudes data?如何使用熊猫经纬度数据快速计算距离?
【发布时间】:2020-12-15 23:18:18
【问题描述】:

我有一张带有不同位置数据的熊猫表。例如,纽约市有很多学校、医院、商店等。每个都有自己的经度和纬度。

我有 40000 行数据和两列数据(经度和纬度)。我想计算它们之间的距离(总共 40000*40000)。

我使用 hasrsine 公式 (Haversine Formula in Python (Bearing and Distance between two GPS points)) 来处理 pandas。

简单代码为:

results=df.apply(lambda x:haversine(x["lon"],x["lat"],test_lon,test_lat)

我使用每一行作为 test_lon,test_lat,并且需要 10 个小时来计算它们。我无法相信为什么需要这么长时间。

任何人都有快速完成的好主意吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我有一个我一直在使用的解决方法,因为我在斯德哥尔摩的瑞典交通系统中遇到了同样的问题。它很丑,但效果很好。可能有用。我复制了我的原始数据:

    import pandas as pd
    import numpy as np
    import sklearn.neighbors
    
    locations_A = pd.DataFrame({
        'Stopp_A' :     ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
        'latitude_A':  [ 56.75,56.19,56.08,51.28,52.36,51.29,51.87,52.61],
        'longitude_A': [18.39,18.82, 18.65,18.74,18.06,18.61,18.27,18.20]
    })
    
    locations_B = pd.DataFrame({
        'Stopp_B' :     ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
         'latitude_B':  [ 56.75,56.19,56.08,51.28,52.36,51.29,51.87,52.61],
        'longitude_B': [18.39,18.82,18.65,18.74,18.06,18.61,18.27,18.20]
    })
    

    如您所见,我将副本中的位置名称从Stopp_A 更改为Stopp_B。 在此之后,我计算弧度并创建一个距离矩阵:

    locations_A[['lat_radians_A','long_radians_A']] = (
        np.radians(locations_A.loc[:,['latitude_A','longitude_A']])
    )
    locations_B[['lat_radians_B','long_radians_B']] = (
        np.radians(locations_B.loc[:,['latitude_B','longitude_B']])
    )
    
    dist = sklearn.neighbors.DistanceMetric.get_metric('haversine')
    dist_matrix = (dist.pairwise
        (locations_A[['lat_radians_A','long_radians_A']],
         locations_B[['lat_radians_B','long_radians_B']])*6371 #Radius in kilometer
    )
    
    df_dist_matrix = (
        pd.DataFrame(dist_matrix,index=locations_A['Stopp_A'], 
                     columns=locations_B['Stopp_B'])
    )
    
    df_dist = (
        pd.melt(df_dist_matrix.reset_index(),id_vars='Stopp_A')
    )
    df_dist = df_dist_long.rename(columns={'value':'Kilometers'})
    

    返回:

       Stopp_A Stopp_B   Kilometers
    0        A       A     0.000000
    1        B       A  2088.626114
    2        C       A  2043.060585
    3        D       A   950.191543
    4        E       A  1506.375876
    ..     ...     ...          ...
    59       D       H  3051.681403
    60       E       H  3990.191284
    61       F       H  3737.181244
    62       G       H  1083.053543
    63       H       H     0.000000
    
    

    这种方法大大减少了我的计算时间。

    【讨论】:

      猜你喜欢
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      相关资源
      最近更新 更多