从 pandas 数据框到元组(对于 hasrsine 模块)
Posted
技术标签:
【中文标题】从 pandas 数据框到元组(对于 hasrsine 模块)【英文标题】:From pandas dataframe to tuples (for haversine module) 【发布时间】:2017-07-12 09:41:58 【问题描述】:我有一个熊猫数据框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: 无法将系列转换为
使用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']]]))
)
文件“blabla\lib\site-packages\haversine__init__.py”,第 20 行,在 hasrsine 中 lat1, lng1 = point1
ValueError:解包的值太多(预计 2 个)
知道我做错了什么/如何实现我想要的吗?
【问题讨论】:
可能被骗:***.com/questions/25767596/… 【参考方案1】:将apply
与axis=1
一起使用:
my_df["dist"] = my_df.apply(lambda row : haversine.haversine((row["lat1"], row["lon1"]),(row["lat2"], row["lon2"])), axis=1)
要在每一行上调用 hasrsine 函数,该函数理解标量值,而不是类似数组的值,因此会出现错误。通过使用axis=1
调用apply
,您可以逐行迭代,这样我们就可以访问每个列值并以方法期望的形式传递这些值。
我也不知道有什么区别,但是有一个矢量化的 version 的半正弦公式
【讨论】:
【参考方案2】:如何使用矢量化方法:
import pandas as pd
# vectorized haversine function
def haversine(lat1, lon1, lat2, lon2, to_radians=True, earth_radius=6371):
"""
slightly modified version: of http://***.com/a/29546836/2901002
Calculate the great circle distance between two points
on the earth (specified in decimal degrees or in radians)
All (lat, lon) coordinates must have numeric dtypes and be of equal length.
"""
if to_radians:
lat1, lon1, lat2, lon2 = pd.np.radians([lat1, lon1, lat2, lon2])
a = pd.np.sin((lat2-lat1)/2.0)**2 + \
pd.np.cos(lat1) * pd.np.cos(lat2) * pd.np.sin((lon2-lon1)/2.0)**2
return earth_radius * 2 * pd.np.arcsin(np.sqrt(a))
演示:
In [38]: df
Out[38]:
id lat1 lon1 lat2 lon2
0 1 45 0 41 3
1 2 40 1 42 4
2 3 42 2 37 1
In [39]: df['dist'] = haversine(df.lat1, df.lon1, df.lat2, df.lon2)
In [40]: df
Out[40]:
id lat1 lon1 lat2 lon2 dist
0 1 45 0 41 3 507.204107
1 2 40 1 42 4 335.876312
2 3 42 2 37 1 562.543582
【讨论】:
AttributeError: 'numpy.float64' object has no attribute 'radians'
:(
@fmalaussena,确保您没有用一些 float64
变量名称覆盖 np
- numpy
的别名。如果您不使用“经典”numpy 别名np
,那么您可以使用numpy.radians
或pd.np.radians
以上是关于从 pandas 数据框到元组(对于 hasrsine 模块)的主要内容,如果未能解决你的问题,请参考以下文章