从 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】:

applyaxis=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.radianspd.np.radians

以上是关于从 pandas 数据框到元组(对于 hasrsine 模块)的主要内容,如果未能解决你的问题,请参考以下文章

从文件到元组的逐行信息

python pandas数据框到字典

Pandas 数据框到 dict 的 dict

Pandas 数据框到嵌套字典,名称空间为 None

Pandas 数据框到烧瓶模板作为 json [重复]

MySQLdb:Pandas 数据框到 SQL 数据库错误:字符串格式化期间并非所有参数都转换