python - Python:在应用定义的 hasrsine 函数时出现 groupby() 和 apply() 问题
问题描述
我正在尝试通过定义的半正弦函数计算以下数据集的距离。该函数适用于其他数据。但是,在这个特定的数据集中,我正在尝试 groupby(df.index) 并且它给了我错误:
无法将系列转换为 <class 'float'>
我之前使用过 groupby() 和 apply() 并且没有问题。我无法理解在这种情况下发生了什么以及如何解决它。
这是数据
latitude longitude datetime
356a192b7913b04c54574d18c28d46e6395428ab 57.723610 11.925191 2021-06-13 14:22:11.682
356a192b7913b04c54574d18c28d46e6395428ab 57.723614 11.925187 2021-06-13 14:22:13.562
356a192b7913b04c54574d18c28d46e6395428ab 57.723610 11.925172 2021-06-13 14:22:28.635
da4b9237bacccdf19c0760cab7aec4a8359010b0 57.723637 11.925056 2021-06-13 14:22:59.336
da4b9237bacccdf19c0760cab7aec4a8359010b0 57.724075 11.923708 2021-06-13 14:23:44.905
77de68daecd823babbb58edb1c8e14d7106e83bb 57.723610 11.925191 2021-06-13 14:22:04.000
77de68daecd823babbb58edb1c8e14d7106e83bb 57.723614 11.925178 2021-06-13 14:22:44.170
77de68daecd823babbb58edb1c8e14d7106e83bb 57.723827 11.924635 2021-06-13 14:23:14.479
77de68daecd823babbb58edb1c8e14d7106e83bb 57.723866 11.924005 2021-06-13 14:23:29.605
这是代码:
df2 = pd.concat([df.add_suffix('_pre').shift(), trips], axis=1)
df2
>>
latitude_pre longitude_pre datetime_pre latitude longitude datetime
356a192b7913b04c54574d18c28d46e6395428ab NaN NaN NaT 57.723610 11.925191 2021-06-13 14:22:11.682
356a192b7913b04c54574d18c28d46e6395428ab 57.723610 11.925191 2021-06-13 14:22:11.682 57.723614 11.925187 2021-06-13 14:22:13.562
356a192b7913b04c54574d18c28d46e6395428ab 57.723614 11.925187 2021-06-13 14:22:13.562 57.723610 11.925172 2021-06-13 14:22:28.635
da4b9237bacccdf19c0760cab7aec4a8359010b0 57.723610 11.925172 2021-06-13 14:22:28.635 57.723637 11.925056 2021-06-13 14:22:59.336
da4b9237bacccdf19c0760cab7aec4a8359010b0 57.723637 11.925056 2021-06-13 14:22:59.336 57.724075 11.923708 2021-06-13 14:23:44.905
77de68daecd823babbb58edb1c8e14d7106e83bb 57.724075 11.923708 2021-06-13 14:23:44.905 57.723610 11.925191 2021-06-13 14:22:04.000
77de68daecd823babbb58edb1c8e14d7106e83bb 57.723610 11.925191 2021-06-13 14:22:04.000 57.723614 11.925178 2021-06-13 14:22:44.170
77de68daecd823babbb58edb1c8e14d7106e83bb 57.723614 11.925178 2021-06-13 14:22:44.170 57.723827 11.924635 2021-06-13 14:23:14.479
77de68daecd823babbb58edb1c8e14d7106e83bb 57.723827 11.924635 2021-06-13 14:23:14.479 57.723866 11.924005 2021-06-13 14:23:29.605
df2.groupby(df2.index).apply(lambda x: haversine(x['latitude_pre'], x['longitude_pre'], x['latitude'], x['longitude']))
>>
cannot convert the series to <class 'float'>
如果需要,这里是 hasrsine():
def haversine(lat1, lon1, lat2, lon2):
R = 6373.0 * 1000 # Earth's radius (in m)
dlon = radians(lon2) - radians(lon1)
dlat = radians(lat2) - radians(lat1)
a = math.sin(dlat / 2)**2 + math.cos(radians(lat1)) * math.cos(radians(lat2)) * math.sin(dlon / 2)**2
return R *2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
需要 _pre 列的原因是因为我正在迭代相同列的点坐标。由于第一个点坐标没有前一个点来计算距离,因此应用了移位。
编辑:
我试图将 datetime 列从 datetime 转换为 epoch 并且错误仍然存在。目前,所有列都是浮点类型。
要将其转换为纪元,我使用了:
import datetime as dt
df['datetime'] = (df['datetime'] - dt.datetime(1970,1,1)).dt.total_seconds()
也试过:
shift(fill_value=0)
并得到同样的错误
解决方案
如果你将 print(lat1) 添加到你的 hasrsine 函数,你会得到这个打印:
356a192b7913b04c54574d18c28d46e6395428ab NaN
356a192b7913b04c54574d18c28d46e6395428ab 57.723610
356a192b7913b04c54574d18c28d46e6395428ab 57.723614
Name: latitude_pre, dtype: float64
356a192b7913b04c54574d18c28d46e6395428ab NaN
356a192b7913b04c54574d18c28d46e6395428ab 57.723610
356a192b7913b04c54574d18c28d46e6395428ab 57.723614
Name: latitude_pre, dtype: float64
356a192b7913b04c54574d18c28d46e6395428ab NaN
356a192b7913b04c54574d18c28d46e6395428ab 57.723610
356a192b7913b04c54574d18c28d46e6395428ab 57.723614
Name: latitude_pre, dtype: float64
356a192b7913b04c54574d18c28d46e6395428ab NaN
356a192b7913b04c54574d18c28d46e6395428ab 57.723610
356a192b7913b04c54574d18c28d46e6395428ab 57.723614
Name: latitude_pre, dtype: float64
lat1 的“值”是一系列而不是单个值。那是你要的吗?目前尚不清楚这是否是您想要的,但我认为存在错误,因为它正在寻找单个值。
推荐阅读
- javascript - 如何使用Node js返回数组(由API数据创建)
- reactjs - 如何在反应中删除列表中的元素?
- c# - 将 String 转换为 ListViewItem 对象名称
- mysql - 试图从 JSON 格式构建 mySQL 数据库,但不知道如何
- r - 使用插入符号运行逻辑回归时出现错误消息
- regex - 正则表达式匹配特定域及其子文件夹
- php - Laravel Livewire,初始请求后的全局范围错误
- c# - 如何在 Windows 窗体的 MainMenu 中添加分隔符
- selenium - 当菜单项 web 元素不可用时如何单击菜单项
- typescript - postgres中的反向关系