2 votes

Comment calculer la somme des distances euclidiennes d'un point de données à tous les autres points de données d'un dataframe pandas ?

J'ai le dataframe pandas suivant :

import pandas as pd
import math

df = pd.DataFrame()
df['x'] = [2, 1, 3]
df['y'] = [2, 5, 6]
df['weight'] = [11, 12, 13]
print(df)

     x    y   weight   
 0   2    2       11       
 1   1    5       12       
 2   3    6       13       

Supposons que ces 3 nœuds soient appelés respectivement {a, b, c}. Je souhaite calculer les distances euclidiennes totales d'un nœud à tous les autres nœuds multipliées par son poids, comme suit :

Sum = 11(d(a,b)+d(a,c)) + 12(d(b,a)+d(b,c)) + 13(d(c,a)+d(c,b))

2voto

Divakar Points 20144

Utilisation SciPy's cdist -

In [72]: from scipy.spatial.distance import cdist

In [73]: a = df[['x','y']].values

In [74]: w = df.weight.values

In [100]: cdist(a,a).sum(1) * w
Out[100]: array([ 80.13921614,  64.78014765,  82.66925684])

Nous pouvons également utiliser une combinaison de pdist y squareform de la même méthode SciPy pour remplacer cdist là.

Vérifier avec ces valeurs réelles -

In [76]: from scipy.spatial.distance import euclidean

In [77]: euclidean([2,2],[1,5])*11 + euclidean([2,2],[3,6])*11
Out[77]: 80.139216143646451

In [78]: euclidean([1,5],[2,2])*12 + euclidean([1,5],[3,6])*12
Out[78]: 64.78014765201803

In [80]: euclidean([3,6],[2,2])*13 + euclidean([3,6],[1,5])*13
Out[80]: 82.669256840526856

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X