【问题标题】:Pandas pivoting with boolean用布尔值旋转的熊猫
【发布时间】:2018-06-07 10:53:02
【问题描述】:

我正在尝试学习如何创建路径并以这种方式重新排列和旋转数据。 我正在练习的示例数据如下所示。

ID  Time     Latitude  Longitude            
1   2:00    60.092033  20.765083                 
1   3:00    60.097300  20.672767                 
1   4:00    60.125550  20.593650                 
1   5:00    60.115233  20.505367                  
1   6:00    60.103800  20.425850                  
1   7:00    60.113750  20.335717                  
1   8:00    60.115683  20.303683                  
1   9:00    60.114817  20.305500                 
1   10:00   60.077983  20.316917                  
1   11:00   60.034500  20.305317

这些是给定时间内对象的纬度和经度。我有几个目标坐标,我想检查该对象是否在这些目标坐标内。我使用的半径为 2 公里,如果对象在 2 公里以内,那么我想从起始坐标旋转到当前坐标并使其像一条路径。第二次旋转在第一次旋转结束后立即开始。

我正在使用 hasrsine libray 来计算两个不同坐标之间的距离(公里)。

lat = df['Latitude'].values
long = df['Longitude'].values
CurrentCoordinates = zip(lat, long)
TargetedCoordinates = [60.103900, 20.415850]

for i, j in CurrentCoordinates
    print(haversine((i, j), TargetedCoordinates))

这给了我每个当前坐标和目标坐标之间的所有距离。

任何类型的建议都会很棒。 谢谢

【问题讨论】:

  • 能否请您添加所需输出的示例?
  • @zipa 的愿望输出有点像下面接受的答案中给出的。对于额外的计算,我将尝试按照下面的答案中的建议使用 networkx。但是,如果您碰巧知道一些简单的方法,我也很乐意尝试这些方法。 :)

标签: python pandas pivot


【解决方案1】:

如果我理解正确,您希望将原始数据帧中的每个坐标与每个目标坐标进行比较,如果相应的距离小于 2 公里,则得到一个指标数据帧为真。

这是一种方法。关键成分是scipy.spatial.distance.cdist,它可以计算成对距离。

import pandas as pd
import numpy as np
from scipy.spatial.distance import cdist
from haversine import haversine

df = pd.read_csv(
    pd.compat.StringIO(
        """ID  Time     Latitude  Longitude
1   2:00    60.092033  20.765083
1   3:00    60.097300  20.672767
1   4:00    60.125550  20.593650
1   5:00    60.115233  20.505367
1   6:00    60.103800  20.425850
1   7:00    60.113750  20.335717
1   8:00    60.115683  20.303683
1   9:00    60.114817  20.305500
1   10:00   60.077983  20.316917
1   11:00   60.034500  20.305317"""
    ),
    sep=r" +",
)

targets = pd.DataFrame(
    [[60.103900, 20.415850], [60.403900, 20.715850]], columns=["Latitude", "Longitude"]
)

res_data = (
    cdist(
        df[["Latitude", "Longitude"]],
        targets[["Latitude", "Longitude"]],
        metric=haversine,
    )
    < 2
)

res_df = pd.DataFrame(
    res_data,
    index=df[["Latitude", "Longitude"]].round(3).apply(tuple, axis=1),
    columns=targets[["Latitude", "Longitude"]].round(3).apply(tuple, axis=1),
)

结果:

                  (60.104, 20.416)  (60.404, 20.716)
(60.092, 20.765)             False             False
(60.097, 20.673)             False             False
(60.126, 20.594)             False             False
(60.115, 20.505)             False             False
(60.104, 20.426)              True             False
(60.114, 20.336)             False             False
(60.116, 20.304)             False             False
(60.115, 20.306)             False             False
(60.078, 20.317)             False             False
(60.034, 20.305)             False             False

【讨论】:

  • 谢谢,这是我有点想实现的。还有一个问题,我如何从坐标60.092, 20.765) 旋转到(60.104, 20.426),因为它已经到达目标坐标(真)。对于下一次旋转,我想从这个坐标(60.114, 20.336) 到某个下一个坐标,当它变为真并且这个继续下去,直到所有坐标都被检查。 :)
  • 我明白了。您可能应该更清楚地将其添加到您的问题主体中;将在几秒钟内回复您。另外,您是否总是按顺序考虑 df 点?
  • 是的,位置坐标总是按顺序排列的,并且可以重复,因为对象可以返回上一个位置,并且从当前位置(在目标坐标上)和下一个位置(它也在目标坐标中)并且一直持续到所有坐标都被检查:)。再次感谢您
  • 看起来您可以通过将原始目标附加到您的df 并运行cdist(df, df, metric=...) 来一次性完成计算。除此之外,如果您想从邻接矩阵中恢复路径,您可能需要查看 networkx 包。
猜你喜欢
  • 2020-03-22
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 2021-05-17
  • 2017-08-25
  • 1970-01-01
相关资源
最近更新 更多