在数据框中使用 geopy 来获取距离

use*_*364 4 python geopy pandas

我是 Geopy 的新手。我在这家运输公司工作,需要获取卡车运行的总公里数。

我在这里看到了一些答案,但它们对我不起作用。

我有来自卡车上安装的 GPS 的以下数据框

    latitude    longitude
0   -25.145439  -54.294871
1   -24.144564  -54.240094
2   -24.142564  -54.198901
3   -24.140093  52.119021
Run Code Online (Sandbox Code Playgroud)

第一步是制作第三个专栏,将所有内容转变为一个点,但我所有的尝试都失败了

我写的

df['point'] = df['latitude'].astype(float),df['longitude'].astype(float)
Run Code Online (Sandbox Code Playgroud)

它返回一个对象。我希望它返回一个点。我的目标是:

    latitude    longitude      Point
0   -25.145439  -54.294871     (-25.145439  -54.294871)
1   -24.144564  -54.240094     (-24.144564  -54.240094)
2   -24.142564  -54.198901     (-24.142564  -54.198901)
3   -24.140093  52.119021      (-24.140093  52.119021)
Run Code Online (Sandbox Code Playgroud)

然后我想与这两个保持距离,这样我就会有这样的东西:

    latitude    longitude      Point                        Distance KM
0   -25.145439  -54.294871     (-25.145439  -54.294871)     0
1   -24.144564  -54.240094     (-24.144564  -54.240094)     0,2
2   -24.142564  -54.198901     (-24.142564  -54.198901)     0,4
3   -24.140093  52.119021      (-24.140093  52.119021)      0,2
Run Code Online (Sandbox Code Playgroud)

请注意,距离是与上面行的差异(它已经按顺序排列)

我在尝试:

df['distance'] = geodesic(df['point'],df['point'].shift(1))
Run Code Online (Sandbox Code Playgroud)

我收到一个错误,它不适用于元组。

有人知道这个问题的解决方案吗?

tks

Kos*_*kov 7

创建一个point系列:

import pandas as pd

df = pd.DataFrame(
    [
        (-25.145439,  -54.294871),
        (-24.144564,  -54.240094),
        (-24.142564,  -54.198901),
        (-24.140093,  52.119021),
    ],
    columns=['latitude', 'longitude']
)

from geopy import Point
from geopy.distance import distance

df['point'] = df.apply(lambda row: Point(latitude=row['latitude'], longitude=row['longitude']), axis=1)
Run Code Online (Sandbox Code Playgroud)
In [2]: df
Out[2]:
    latitude  longitude                                point
0 -25.145439 -54.294871  25 8m 43.5804s S, 54 17m 41.5356s W
1 -24.144564 -54.240094  24 8m 40.4304s S, 54 14m 24.3384s W
2 -24.142564 -54.198901  24 8m 33.2304s S, 54 11m 56.0436s W
3 -24.140093  52.119021    24 8m 24.3348s S, 52 7m 8.4756s E
Run Code Online (Sandbox Code Playgroud)

添加新的移位point_next系列:

In [2]: df
Out[2]:
    latitude  longitude                                point
0 -25.145439 -54.294871  25 8m 43.5804s S, 54 17m 41.5356s W
1 -24.144564 -54.240094  24 8m 40.4304s S, 54 14m 24.3384s W
2 -24.142564 -54.198901  24 8m 33.2304s S, 54 11m 56.0436s W
3 -24.140093  52.119021    24 8m 24.3348s S, 52 7m 8.4756s E
Run Code Online (Sandbox Code Playgroud)
In [4]: df
Out[4]:
    latitude  longitude                                point                           point_next
0 -25.145439 -54.294871  25 8m 43.5804s S, 54 17m 41.5356s W                                 None
1 -24.144564 -54.240094  24 8m 40.4304s S, 54 14m 24.3384s W  25 8m 43.5804s S, 54 17m 41.5356s W
2 -24.142564 -54.198901  24 8m 33.2304s S, 54 11m 56.0436s W  24 8m 40.4304s S, 54 14m 24.3384s W
3 -24.140093  52.119021    24 8m 24.3348s S, 52 7m 8.4756s E  24 8m 33.2304s S, 54 11m 56.0436s W
Run Code Online (Sandbox Code Playgroud)

计算距离:

df['point_next'] = df['point'].shift(1)
df.loc[df['point_next'].isna(), 'point_next'] = None
Run Code Online (Sandbox Code Playgroud)
In [6]: df
Out[6]:
    latitude  longitude                                point   distance_km
0 -25.145439 -54.294871  25 8m 43.5804s S, 54 17m 41.5356s W           NaN
1 -24.144564 -54.240094  24 8m 40.4304s S, 54 14m 24.3384s W    111.003172
2 -24.142564 -54.198901  24 8m 33.2304s S, 54 11m 56.0436s W      4.192654
3 -24.140093  52.119021    24 8m 24.3348s S, 52 7m 8.4756s E  10449.661388
Run Code Online (Sandbox Code Playgroud)