Python 检查坐标数据帧的多个切片之间的最小距离
有两组单元格ID为的列表Python 检查坐标数据帧的多个切片之间的最小距离,python,pandas,list,min,Python,Pandas,List,Min,有两组单元格ID为的列表 A = [4, 6, 2493, 2494, 2495] B = [3, 7, 4983, 4982, 4984, 4981, 4985, 2492, 2496] 上面列表中的每个单元格在df中的单独列中都有X,Y坐标 df 其中A,B列表中的值是单元格id列中的值。我如何才能找到A和B中单元格之间距离的和,但首先查看A中单元格与B的关系?因此,我必须计算A中每个单元格的5(A长度)距离,取这5个单元格的min(),取这9个min值的sum()。我希望这是有道理的 我
A = [4, 6, 2493, 2494, 2495]
B = [3, 7, 4983, 4982, 4984, 4981, 4985, 2492, 2496]
上面列表中的每个单元格在df中的单独列中都有X,Y
坐标
df
其中A
,B
列表中的值是单元格id
列中的值。我如何才能找到A和B中单元格之间距离的和
,但首先查看A中单元格与B
的关系?因此,我必须计算A中每个单元格的5(A长度)距离,取这5个单元格的min()
,取这9个min值的sum()。我希望这是有道理的
我的想法如下:
从列表A中获取第一个值(这是id=4的单元格),并计算B中所有单元格之间的距离,然后仅获取min
值
对A中的所有其他值重复步骤1
对所有距离进行求和(
)
我尝试了下面的代码。。。但失败了
def sum_distances(df, i, col_X='X', col_Y='Y'):
for i in range(A)
return (((df.iloc[B][col_X] - df.iloc[i,2])**2 + (df.iloc[B][col_Y] - df.iloc[i,3])**2)**0.5).min
我不知道如何同时集成min()
和sum()
。如果我没有弄错的话,您正在寻找答案。以下是一种可能的方法(基于此)
以OP的相同格式生成一些虚拟数据
import pandas as pd
import numpy as np
A = [0, 1, 2, 3, 4]
B = [10, 11, 12, 13, 14, 9, 8, 7, 6]
df = pd.DataFrame(np.random.rand(15,2), columns=['X','Y'], index=range(15))
df.index.name = 'CellID'
print('Raw data\n{}'.format(df))
Raw data
X Y
CellID
0 0.125591 0.890772
1 0.754238 0.644081
2 0.952322 0.099627
3 0.090804 0.809511
4 0.514346 0.041740
5 0.678598 0.230225
6 0.594182 0.432634
7 0.005777 0.891440
8 0.925187 0.045035
9 0.903591 0.238609
10 0.187591 0.255377
11 0.252635 0.149840
12 0.513432 0.972749
13 0.433606 0.550940
14 0.104991 0.440052
获得B和A的每个索引之间的最小距离
# Get df at indexes from list A: df_A
df_A = df.iloc[A,]
# For df at each index from list B (df.iloc[b,]), get distance to df_A: d
dist = []
for b in B:
d = (pd.DataFrame(df_A.values - df.iloc[b,].values)**2).sum(1)**0.5
dist.append(d.min())
print('Sum of minimum distances is {}'.format(sum(dist)))
Sum of minimum distances is 2.36509386378
输出(用于B和A的每个索引之间的最小距离之和)
您好,您提供了df
列cellID,X,Y
。是否有两个这样的数据帧-例如df1
和df2
,每个都有cellID、X、Y
列?而且,在我看来,列表A和B分别保存数据帧df1
和df2
的索引。这是正确的吗?如果是这样的话,如果你想知道A和B中单元格之间的距离,列表A和列表B不应该是相同的长度吗?嗨!只有一个df,所有单元id的所有距离都位于其中。关于第二条评论,你是对的。我将重新编辑这个问题。我只是在寻找B中的单元格的最短距离,但是在AIs中的单元格的距离是你必须使用的距离方程:sqrt((X_A-X_B)**2+(Y_A-Y_B)**2)
Yesmath.sqrt起初不起作用,所以我使用了**0.5
非常感谢!很好!如果可以的话,在过去的两个小时里,我一直在疯狂地尝试,如果我尝试多次重复这种方法,它需要进行什么样的重组?不是在您编写解决方案时的A和B之间,而是在其他列表之间,例如,原始列表A是小区5的相邻小区列表,类似的B是其他一些小区的相邻小区id。您提出的简洁解决方案非常适合1个案例。我们如何计算这些列表中的更多内容?
Sum of minimum distances is 2.36509386378