我有一个 pandas 数据框 my_df
,其中包含以下列:
id lat1 lon1 lat2 lon2
1 45 0 41 3
2 40 1 42 4
3 42 2 37 1
基本上,我想做以下事情:
import haversine
haversine.haversine((45, 0), (41, 3)) # just to show syntax of haversine()
> 507.20410687342115
# what I'd like to do
my_df["dist"] = haversine.haversine((my_df["lat1"], my_df["lon1"]),(my_df["lat2"], my_df["lon2"]))
TypeError: cannot convert the series to < class 'float' >
使用this ,我尝试了以下方法:
my_df['dist'] = haversine.haversine(
list(zip(*[my_df[['lat1','lon1']][c].values.tolist() for c in my_df[['lat1','lon1']]]))
,
list(zip(*[my_df[['lat2','lon2']][c].values.tolist() for c in my_df[['lat2','lon2']]]))
)
File "blabla\lib\site-packages\haversine__init__.py", line 20, in haversine lat1, lng1 = point1
ValueError: too many values to unpack (expected 2)
知道我做错了什么/如何实现我想要的吗?
最佳答案
将apply
与axis=1
结合使用:
my_df["dist"] = my_df.apply(lambda row : haversine.haversine((row["lat1"], row["lon1"]),(row["lat2"], row["lon2"])), axis=1)
要在每一行上调用半正矢函数,该函数理解标量值,而不是类似数组的值,因此会出现错误。通过使用 axis=1
调用 apply
,您可以逐行迭代,这样我们就可以访问每个列值并以方法期望的形式传递这些值。
我也不知道有什么区别,但有一个矢量化的 version半正矢公式的计算
关于python-3.x - 从 pandas 数据框到元组(对于半正矢模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45054067/