Проверка минимального расстояния между несколькими срезами кадра данных координат - PullRequest
0 голосов
/ 28 октября 2018

Наличие двух наборов списков с идентификаторами ячеек

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

Где значения в списке A, B соответствуют значениям в столбце cell_id.Как я могу найти sum расстояний между ячейками в A и B, но в первую очередь смотреть на ячейки в A по отношению к B?Поэтому мне нужно рассчитать 5 (длина) расстояний для каждой ячейки в A, взять min() из этих 5 и sum() всех этих девяти минутных значений.Я надеюсь, что это имеет смысл

Я думал следующее:

  1. Возьмите первое значение из списка A (это ячейка с id = 4) и вычислите расстояние между всеми ячейками в B иВозьмите только min значение
  2. Повторите шаг 1 со всеми другими значениями в A
  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() одновременно.

1 Ответ

0 голосов
/ 28 октября 2018

Если я не ошибаюсь, вы ищете евклидово расстояние между (x,y) координатами . Вот один из возможных подходов (на основе этого сообщения SO )

Создайте несколько фиктивных данных в том же формате, что и 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
...