Python 如何计算数据帧中两点之间的距离(以米为单位)?
我有一个数据框架,其中,下标为1的列是起点,下标为2的列是终点。 我想找出它们之间以公里为单位的差异。 我试着跟随,但还是出错了Python 如何计算数据帧中两点之间的距离(以米为单位)?,python,pandas,Python,Pandas,我有一个数据框架,其中,下标为1的列是起点,下标为2的列是终点。 我想找出它们之间以公里为单位的差异。 我试着跟随,但还是出错了 import mpu import pandas as pd import numpy as np data = {'lat1': [39.92123, 39.93883, 39.93883, 39.91034, 39.91248], 'lon1': [116.51172, 116.51135, 116.51135, 116.51627, 1
import mpu
import pandas as pd
import numpy as np
data = {'lat1': [39.92123, 39.93883, 39.93883, 39.91034, 39.91248],
'lon1': [116.51172, 116.51135, 116.51135, 116.51627, 116.47186],
'lat2': [np.nan, 39.92123, 39.93883, 39.93883, 39.91034],
'lon2': [np.nan, 116.51172, 116.51135, 116.51135, 116.51627 ]}
# Create DataFrame
df = pd.DataFrame(data)
df['distance'] = mpu.haversine_distance((df.lat1, df.lon1), (df.lat2, df.lon2))
ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()
尝试将.apply()
与lambda函数一起使用,以便可以将坐标作为标量值传递,而不是现在将4个系列传递给函数:
df['distance'] = df.apply(lambda x: mpu.haversine_distance((x.lat1, x.lon1), (x.lat2, x.lon2)), axis=1)
您还可以使用list(map(…)
来加快执行速度,如下所示:
df['distance'] = list(map(mpu.haversine_distance, zip(df.lat1, df.lon1), zip(df.lat2, df.lon2)))
你不打算告诉我们错误是什么?@takendarkk抱歉,我加了一个错误:传递级数而不是标量值的结果。你使用的方法只对一对坐标有效。如果你想将其矢量化,那么可能是一个更好的选择。谢谢。但是apply函数会做得很慢,因为我有1mln。排。还有其他更快的选择吗?@JohnMayer好的,你可以使用
list(map(…)
。让我给你看看。谢谢。我还发现矢量化可以解决这个问题。代码看起来像np.vectorize(mpu.haversine_distance)((df.lat1,df.lon1),(df.lat2,df.lon2))
。或者在本例中无法应用矢量化?@JohnMayer并没有真正做矢量化的事情。您可以看到文档中说“提供矢量化功能主要是为了方便,而不是为了性能。实现基本上是一个for循环。”因此,它无法对循环进行改进。我也尝试了使用列表(map(…)
)的选项,但是得到和错误值错误:太多的值无法解包(预期为2)
,以及数据。应用(lambda x:mpu.haversine_距离((x.lat1,x.lon1),(x.lat2,x.lon2),axis=1))
(我添加了一个括号)有错误“%Series”对象没有属性“lat1”`