【发布时间】:2021-10-12 19:32:01
【问题描述】:
我正在尝试将以下函数应用于 Pandas 数据框:
def eukarney(lat1, lon1, alt1, lat2, lon2, alt2):
p1 = (lat1, lon1)
p2 = (lat2, lon2)
karney = distance.distance(p1, p2).m
return np.sqrt(karney**2 + (alt2 - alt1)**2)
如果我使用离散值,例如:
distance = eukarney(49.907611, 5.890404, 339.15734, 49.907683, 5.890373, 339.18224)
但是,如果我尝试将该函数应用于 Pandas 数据框:
df['distances'] = eukarney(df['latitude'], df['longitude'], df['altitude'], df['latitude'].shift(), df['longitude'].shift(), df['altitude'].shift())
这意味着从一行和前一行中获取值。
我收到以下错误消息:
Traceback(最近一次调用最后一次):文件 “/home/mirix/Desktop/plage/GPX_invert_sense_change_starting_point_va.py”, 第 78 行,在 df['distances'] = eukarney(df.loc[:,'latitude':], df.loc[:,'longitude':], df.loc[:,'altitude':], df.loc[:,'纬度':].shift(), df.loc[:,'经度':].shift(), df.loc[:,'altitude':].shift()) 文件 “/home/mirix/Desktop/plage/GPX_invert_sense_change_starting_point_va.py”, 第 75 行,在尤卡尼 karney = distance.distance(p1, p2).m 文件“/home/mirix/.local/lib/python3.9/site-packages/geopy/distance.py”, 第 522 行,在 init 中 super().init(*args, **kwargs) 文件 "/home/mirix/.local/lib/python3.9/site-packages/geopy/distance.py", 第 276 行,在 init 中 km += self.measure(a, b) 文件“/home/mirix/.local/lib/python3.9/site-packages/geopy/distance.py”, 第 538 行,测量中 a, b = Point(a), Point(b) 文件“/home/mirix/.local/lib/python3.9/site-packages/geopy/point.py”,行 175,在新 返回 cls.from_sequence(seq) 文件“/home/mirix/.local/lib/python3.9/site-packages/geopy/point.py”,行 第472章 返回 cls(*args) 文件“/home/mirix/.local/lib/python3.9/site-packages/geopy/point.py”,行 188,在新 _normalize_coordinates(纬度,经度,高度)文件“/home/mirix/.local/lib/python3.9/site-packages/geopy/point.py”,行 57,在_normalize_coordinates 纬度=浮动(纬度或0.0)文件“/home/mirix/.local/lib/python3.9/site-packages/pandas/core/generic.py”, 第 1534 行,在 非零 raise ValueError(ValueError: DataFrame的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。
有趣的是,相同的语法适用于不使用 geopy 库的其他函数。
有什么想法吗?
解决方案
GeoPy 的距离函数似乎有一个内在限制,它似乎只接受标量。
以下解决方法基于以下@SeaBen 回答:
df['lat_shift'] = df['latitude'].shift().fillna(df['latitude'])
df['lon_shift'] = df['longitude'].shift().fillna(df['longitude'])
df['alt_shift'] = df['altitude'].shift().fillna(df['altitude'])
df['distances'] = df.apply(lambda x: eukarney(x['latitude'], x['longitude'], x['altitude'], x['lat_shift'], x['lon_shift'], x['alt_shift']), axis=1).fillna(0)
【问题讨论】:
-
这是什么
distance.distance?它接受np.array还是只接受标量/浮点数? -
distance.distance 来自 geopy 导入距离。 geopy.readthedocs.io/en/stable/#module-geopy.distance
-
抱歉,忽略了您需要使用
shift()值。因此,以这种方式逐行使用.apply()是不可能的。 -
@SeaBean 如果我将数据添加为新列,您的解决方案将有效。我试图避免这种情况,但这是我能找到的唯一解决方法。
-
是的,同意添加新列是一种简单的方法。