Python 检查坐标数据帧的多个切片之间的最小距离

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()。我希望这是有道理的 我

有两组单元格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中获取第一个值(这是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)
    Yes
    math.sqrt起初不起作用,所以我使用了
    **0.5
    非常感谢!很好!如果可以的话,在过去的两个小时里,我一直在疯狂地尝试,如果我尝试多次重复这种方法,它需要进行什么样的重组?不是在您编写解决方案时的A和B之间,而是在其他列表之间,例如,原始列表A是小区5的相邻小区列表,类似的B是其他一些小区的相邻小区id。您提出的简洁解决方案非常适合1个案例。我们如何计算这些列表中的更多内容?
    Sum of minimum distances is 2.36509386378