Python 如何计算数据帧中两点之间的距离(以米为单位)?

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

我有一个数据框架,其中,下标为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, 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”`