首页 > 解决方案 > 检查坐标数据帧的多个切片之间的最小距离

问题描述

有两组带有单元格 ID 的列表

A = [4, 6, 2493, 2494, 2495]
B = [3, 7, 4983, 4982, 4984, 4981, 4985, 2492, 2496]

并且上列表中的每个单元格X, Y在 df 的单独列中都有坐标,每个。

df

cell_ID; X ;Y
1; 5; 6
2; 10; 6
...

其中AB列表中的值是cell_id列中的值。我怎样才能找到sumA 和 B 中单元格之间的距离,但主要是查看与A相关的单元格B?所以我必须为 A 中的每个单元格计算 5 个(A 长度)距离,取min()这 5 个和sum()所有这 9 个最小值。我希望这是有道理的

我在想以下几点:

  1. 从列表 A 中获取第一个值(这是 id = 4 的单元格)并计算 B 中所有单元格之间的距离,然后仅获取该min
  2. 对 A 中的所有其他值重复步骤 1
  3. 做一个sum()所有的距离

我尝试使用下面的代码......但失败了

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()同时。

标签: pythonpandaslistmin

解决方案


如果我没记错的话,你正在寻找坐标之间的欧几里得距离(x,y)。这是一种可能的方法(基于this SO post

生成一些与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)))

输出(对于 B 和 A 的每个索引之间的最小距离之和)

Sum of minimum distances is 2.36509386378

推荐阅读