Евклидово расстояние между двумя пандами данных - PullRequest
1 голос
/ 13 мая 2019

У меня есть два кадра данных:

df1 формы

user_id  | x_coord  | y_coord
 214         -55.2      22.1
 214         -55.2      22.1
 214         -55.2      22.1
...

и df2, одной формы, но с разными пользователями:

user_id  | x_coord  | y_coord
 512         -15.2      19.1
 362          65.1      71.4
 989         -84.8      13.7
...

Идея состоит в том, что я хочу найти евклидово расстояние между пользователем в df1 и всеми пользователями в df2. Для этого мне нужно иметь возможность вычислить евклидово расстояние между двумя кадрами данных на основе последних двух столбцов, чтобы выяснить, кто из ближайших пользователей во втором кадре данных является пользователем 214.

Я нашел этот ответ , но это не то, что мне нужно, так как мои два кадра данных имеют одинаковую форму, и мне нужно расстояние, рассчитанное для каждой строки:

Euclidean_Distance_i(row_i_df1, row_i_df2)

и сохраните все эти расстояния в списке такой же длины, что и эти кадры данных.

Ответы [ 3 ]

1 голос
/ 13 мая 2019

Сначала мы можем получить координаты в виде массивов NumPy.

x1 = df1.x_coord.values
x2 = df2.x_coord.values

y1 = df1.y_coord.values
y2 = df2.y_coord.values

Затем мы можем рассчитать квадрат расстояния,

d2 = np.square( x2 - x1 )  + np.square( y2 - y1 ) 

distances = np.sqrt( d2 )

Массив distances - это необходимое расстояние на строку.

1 голос
/ 13 мая 2019

Так в вашем случае

from scipy.spatial import distance
ary = distance.cdist(df1.iloc[:,1:], df2.iloc[:,1:], metric='euclidean')

df2.iloc[ary.argmin(1),0]
Out[759]: 
2    989
2    989
2    989
Name: user_id, dtype: int64

df1['close_from_df2']=df2.iloc[ary.argmin(1),0].values
1 голос
/ 13 мая 2019

Попробуйте:

def Euclidean_Dist(df1, df2, cols=['x_coord','y_coord']):
    return np.linalg.norm(df1[cols].values - df2[cols].values,
                   axis=1)

Тест:

df1 = pd.DataFrame({'user_id':[214,214,214],
                'x_coord':[-55.2,-55.2,-55.2],
                'y_coord':[22.1,22.1,22.1]})

df2 = pd.DataFrame({'user_id':[512, 362, 989],
                    'x_coord':[-15.2, 65.1, -84.8],
                    'y_coord':[19.1, 71.4, 13.7]})

Euclidean_Dist(df1, df2)

выходы:

array([ 40.11234224, 130.0099227 ,  30.76881538])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...