查找具有固定起点的组的 X 和 Y 之间的距离

Find distance between X and Y of groups with fixed start point

import numpy as np
import pandas as pd

这是计算距离的数据

data = pd.read_csv(r'survey_data.csv',
                   delimiter=',')

start = pd.read_csv(r'start_points.csv',
                   delimiter=',')
print(data)
print(start)

data['Trans'] = data['Trans'].str.upper()

仅获取起点文件中使用的横断面

unique = data['Trans'].unique()
start = pd.DataFrame(start.loc[start['Trans'].isin(unique)])

选择要使用的列

start['Dist'] = 0.0
cols = ['Y','X', 'Elev']

将Trans设为索引库

a = data.set_index('Trans')[cols]
b = start.set_index('Trans')[cols]

使用勾股定理计算距离。这段代码是我收到错误消息的地方

a['Dist'] = (a.subtract(b, level=0)**2).sum(axis=1)**(1/2)

堆叠起点和计算点并排序

r = pd.concat([a.reset_index(), start]).sort_values(by = ['Trans', 'Dist'])


print(r)

用于数据的文件

  Trans      Y      X  Elev
0     TR9  101.5  101.5   5.5
1     TR9  111.0  111.0   8.0
2     TR9  121.0  121.0   6.0
3     TR9  131.0  131.0   7.0
4     TR9  141.0  141.0   4.0
5    TR10  101.0  201.0   2.0
6    TR10  111.0  211.0   6.0
7    TR10  121.0  221.0   5.0
8    TR10  131.0  231.0   7.0
9    TR10  141.0  241.0   8.0
10  GRAND  101.0  301.0   5.0
11  GRAND  111.0  311.0   6.0
12  GRAND  121.0  321.0   7.0
13  GRAND  131.0  331.0   9.0
14  GRAND  141.0  341.0   5.0
15   TR11  101.0  401.0   4.0
16   TR11  111.5  411.5   6.0
17   TR11  121.0  421.0   8.0
18   TR11  131.0  431.0   4.0
19   TR11  141.0  441.0   2.0

用于起点的文件

   Trans      Y      X   Elev
0    TR9   99.5   99.5    4.0
1   TR10   99.0  199.5    3.2
2  GRAND   99.0  299.5    6.5
3   TR11   99.0  399.5    8.2
4   TR99  999.0  999.0  999.9

EDIT - 由于您更新了问题并更改了数据、列名和行,这里是最新编辑问题的解决方案。下面详细解释。

start['Dist'] = 0.0  #Adding Dist column to s

#getting X, Y and setting index to "Trans"
cols = ['X','Y', 'Elev']
a = data.set_index('Trans')[cols]
b = start.set_index('Trans')[cols]
b = b.loc[a.index.unique()]  #<--- to ensure that same trans elements exist in both

#Calculating broadcasted distance (by index)
#D = √((Long1-Long2)²+(Lat1-Lat2)²+(Alt1-Alt2)²)
a['Dist'] = list((a.subtract(b, level=0)**2).sum(axis=1)**(1/2))

#Stacking start points and calculated points and sorting 
r = pd.concat([a.reset_index(), start]).sort_values(by = ['Trans', 'Dist'])
print(r)
    Trans      X      Y   Elev       Dist
2   GRAND  299.5   99.0    6.5   0.000000
10  GRAND  301.0  101.0    5.0   4.887740
11  GRAND  311.0  111.0    6.0  17.466826
12  GRAND  321.0  121.0    7.0  30.761827
13  GRAND  331.0  131.0    9.0  45.098670
14  GRAND  341.0  141.0    5.0  59.369100
1    TR10  199.5   99.0    3.2   0.000000
5    TR10  201.0  101.0    2.0   2.773085
6    TR10  211.0  111.0    6.0  16.854970
7    TR10  221.0  121.0    5.0  30.813796
8    TR10  231.0  131.0    7.0  45.063178
9    TR10  241.0  141.0    8.0  59.239261
3    TR11  399.5   99.0    8.2   0.000000
15   TR11  401.0  101.0    4.0   3.201562
16   TR11  411.5  111.5    6.0  16.748134
17   TR11  421.0  121.0    8.0  30.471298
18   TR11  431.0  131.0    4.0  44.648628
19   TR11  441.0  141.0    2.0  58.689863
0     TR9   99.5   99.5    4.0   0.000000
0     TR9  101.5  101.5    5.5   2.915476
1     TR9  111.0  111.0    8.0  16.628289
2     TR9  121.0  121.0    6.0  30.765240
3     TR9  131.0  131.0    7.0  44.972214
4     TR9  141.0  141.0    4.0  59.063525
4    TR99  999.0  999.0  999.9   0.000000

详情-

  1. Transect 设置为每个数据帧的索引并仅保留 NorthingEastingElev
  2. 在2个数据帧之间使用df.subtract并设置level=0。这样做的目的是它将使用 broadcasting 减去具有相同索引的所有行。因此,index=A 的第一行和第二行的 2 行将通过广播减去以得到 2 行。每个功能的其他功能也类似。
  3. 获得相减后的数据帧后,只需取 square,对 axis=1 求和,然后取 square root 得到距离。

D=√((Long1-Long2)²+(Lat1-Lat2)²+(Alt1-Alt2)²)

  1. 最后将这个系列设置为原始数据集的['dist']列。