熊猫用布尔旋转

时间:2018-06-07 10:53:03

标签: python pandas pivot

我正在尝试学习如何以这种方式创建路径并重新排列和旋转数据。 我正在练习的样本数据看起来像这样。

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 km,如果物体在2km以内,那么我想从起始坐标转到当前坐标并使其像路径一样。第一次旋转结束后,第二次旋转开始。

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

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))

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

任何建议都会很棒。 谢谢

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望将原始数据框中的每个坐标与每个目标坐标进行比较,并在相应距离小于2 km时获取指标的数据框。

这是一种方法。关键因素是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