【发布时间】:2020-03-30 01:04:26
【问题描述】:
我有一个可以使用任何编程语言完成的作业。我选择了 Python 和 pandas,因为我没有使用这些的经验,并认为这将是一次很好的学习体验。我能够使用我从传统计算机编程中知道的传统循环来完成任务,并且它在数千行上运行良好,但是一旦我让它处理数百万行,它就会让我的笔记本电脑突然停止。任务概述如下。
您在二维平面上有一条两条车道的道路。一条车道供汽车使用,另一条车道供卡车使用。数据如下所示(每个表跨越数百万行):
汽车
id start end
0 C1 200 215
1 C2 110 125
2 C3 240 255
...
卡车
id start end
0 T1 115 175
1 T2 200 260
2 T3 280 340
3 T4 25 85
...
上面的两个dataframe对应这个:
start 和 end 列代表道路上的任意位置,其中 start = 车辆的后边缘,end = 车辆的前边缘。
任务是识别离每辆车最近的卡车。一辆卡车与一辆汽车最多可以有三种不同的关系:
- Back - 它在汽车后部 (
cars.end > trucks.end) - 对面 - 在汽车对面 (
cars.start >= trucks.start and cars.end <= trucks.end) - 前面 - 它在汽车前面 (
cars.start < trucks.start)
我强调“最多”,因为如果后面或前面有另一辆车更靠近最近的卡车,那么这种关系将被忽略。在上图的情况下,我们可以观察到以下几点:
- C1:背面 = T1,横向 = T2,正面 = 无(C3 阻挡)
- C2:背面 = T4,横向 = 无,正面 = T1
- C3:后方 = 无(C1 阻挡),交叉 = T2,前方 = T3
最终输出需要与以下新列一起附加到 cars 数据框:
- 从
trucks数据帧交叉引用的数据 - 对于后面的位置,间隙距离 (
cars.start - trucks.end) - 对于前面的位置,间隙距离 (
trucks.start - cars.end)
最终的cars 数据框应如下所示:
id start end back_id back_start back_end back_distance across_id across_start across_end front_id front_start front_end front_distance
0 C1 200 215 T1 115 175 25 T2 200 260
1 C2 110 125 T4 25 85 25 T1 115 175 -10
2 C3 240 255 T2 200 260 T3 280 340 25
熊猫是完成这项任务的最佳工具吗?如果有一个更合适的工具可以有效地交叉引用和附加基于数百万行的计算的列,那么我会全力以赴。
【问题讨论】:
-
如果您已经有一个良好的循环
for来完成这项工作,请查看可以加快您的代码速度的库 Numba。在 pandas 中,merge_asof 可以帮助您了解三个不同的方向,您可以将其作为参数传递以查找您的 3 个关系