【问题标题】:How put latitude and longitude in one column quickly?如何快速将经纬度放在一栏中?
【发布时间】:2021-07-21 17:07:53
【问题描述】:

我需要计算两个数据点((lat1,lon1) 和 (lat2,lon2))之间的距离。

我找到了方法here

import geopy.distance

coords_1 = (52.2296756, 21.0122287)
coords_2 = (52.406374, 16.9251681)

print geopy.distance.vincenty(coords_1, coords_2).km

因此,我需要将纬度和经度转换为一列 我找到了一个方法here,但是,它需要很多时间。

df["point1"] = df[["lon1", "lat1"]].apply(Point, axis=1)
df["point2"] = df[["lon2", "lat2"]].apply(Point, axis=1)


有更快的解决方案吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    尝试使用geopandas.points_from_xy()

    import geopandas
    df['points1'] = geopandas.points_from_xy(df.lon1, df.lat1)
    df['points2'] = geopandas.points_from_xy(df.lon2, df.lat2)
    

    如果仍然太慢,请安装 pygeos,它将矢量化 points_from_xy() 并加快速度。

    【讨论】:

    • 是的,它正在工作,但是是否可以使新列的格式为[41.141412, -8.618643] 而不是POINT (41.141412, -8.618643)?因为在我需要使用df[df.city == 'ALL'].points1.values.tolist() 将值保存在列表中之后(我插入的值好像没有出现错误'GeometryArray' object has no attribute 'tolist')
    【解决方案2】:

    如果你想要 (x,y) 形式的元组,你可以这样做:

    想象一下你的数据框是这样的:

    df = pd.read_csv(r"C:\users\k_sego\LatLong.csv", sep=";")
    print(df)
    
            Lat        Lon
    0   59.214735  18.062262
    1   59.214735  18.062262
    2   59.214735  18.062262
    3   59.213542  18.063627
    4   59.212553  18.064678
    ..        ...        ...
    70  59.199559  18.046147
    71  59.199559  18.046147
    72  59.199559  18.046147
    73  59.198898  18.051291
    74  59.199044  18.055571
    

    然后

    df['new_col'] = list(zip(df.Lat, df.Lon))
    

    产生这个:

    Lat        Lon                 new_col
    0   59.214735  18.062262  (59.214735, 18.062262)
    1   59.214735  18.062262  (59.214735, 18.062262)
    2   59.214735  18.062262  (59.214735, 18.062262)
    3   59.213542  18.063627  (59.213542, 18.063627)
    4   59.212553  18.064678  (59.212553, 18.064678)
    ..        ...        ...                     ...
    70  59.199559  18.046147  (59.199559, 18.046147)
    71  59.199559  18.046147  (59.199559, 18.046147)
    72  59.199559  18.046147  (59.199559, 18.046147)
    73  59.198898  18.051291  (59.198898, 18.051291)
    74  59.199044  18.055571  (59.199044, 18.055571)
    
    

    【讨论】:

    • 感谢您的回答。我对 python 有点陌生,我想我需要数组 [] 。我还用元组尝试了我的代码,如果在此 zip() 之后运行代码 df[df.city == 'ALL'].points1.tolist(),则会出现错误 >'tuple' object has no attribute 'tolist'
    【解决方案3】:

    如果你想将“点”作为一个元组 -

    df['point1'] = list(zip(df['lat1'].values, df['lon1'].values))
    

    如果您想将“点”作为列表 -

    df['point1'] = list(map(list,zip(df['lat1'].values, df['lon1'].values)))
    

    性能比较 ->

    %timeit geopandas.points_from_xy(df.D, df.B)
    108 µs ± 2.55 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    
    %timeit list(map(list,zip(df['D'].values, df['B'].values)))
    4.82 µs ± 12.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    

    如您所见,如果您使用 zip/list/map,它会快很多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 2021-06-11
      • 2015-07-08
      相关资源
      最近更新 更多