es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Reemplaza un punto 2D en un dataframe con un punto 2D en otro dataframe si la distancia Euclidiana entre ellos es la más baja.

Tengo un dataframe df1 con dos columnas V1 y V2 que representan dos coordenadas de un punto.

df1

V1           V2
1.30344679   0.060199021
1.256628917  0.095897457
0.954959945  0.237514922
1.240081297  0.053228255
1.35765432   0.033412217
1.228539425  0.079924064
1.080489363  0.204162117
1.27587021   0.085286683
1.44         0
0.93719247   0.310292371

Hay otro dataframe df2 con dos columnas C1 y C2 que representan dos coordenadas de un punto.

df2

C1           C2
0.083        0.323657888
1.293934451  0.046950426
1.252872503  0.09000528
0.148131303  0.347930828

df1 y df2 tienen longitudes diferentes. En este ejemplo, habrá sustituciones para cuatro puntos en df1. Básicamente, cuatro puntos en df2 reemplazan cuatro puntos en df1 si la distancia euclidiana entre ellos es la más baja.

También podemos decir que cada punto en df2 reemplaza solo el punto más cercano en df1. ¿Cómo podemos lograr esto?

Problema de duplicados: El número de dígitos después del decimal es 9. Por lo tanto, supongo que no surgirá el problema de duplicados (es decir, más de un punto en df1 tiene la misma distancia euclidiana y el valor de distancia es el más bajo). Si ocurre, ¿podemos reemplazar una fila al azar?

Resultado deseado: df1 revisado del mismo tamaño que df1 pero con cuatro puntos de df2 reemplazados.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto, podemos calcular la distancia euclidiana entre cada punto en df1 y cada punto en df2, y luego reemplazar el punto más cercano en df1 con el punto correspondiente en df2.

    Aquí está el proceso paso a paso para lograr esto:

    1. Define una función para calcular la distancia euclidiana entre dos puntos en un espacio bidimensional. Podemos usar la función “euclidean” del módulo “scipy.spatial.distance” para calcular esta distancia.
      from scipy.spatial.distance import euclidean
      
      def calc_euclidean(point1, point2):
         return euclidean(point1, point2)
      
    2. Itera a través de cada punto en df1. Para cada punto, calcula la distancia euclidiana a todos los puntos en df2 usando la función “calc_euclidean” definida anteriormente. Encuentra la distancia mínima y el punto correspondiente en df2.
      for index1, row1 in df1.iterrows():
         min_dist = float('inf')
         for index2, row2 in df2.iterrows():
             dist = calc_euclidean(row1, row2)
             if dist < min_dist:
                 min_dist = dist
                 min_point = row2
         # replace the closest point in df1 with the corresponding point in df2
         df1.loc[index1] = min_point
      
    3. El bucle anterior reemplazará el punto más cercano en df1 con el punto correspondiente en df2. Repite este proceso cuatro veces para reemplazar los cuatro puntos más cercanos.
      for i in range(4):
         for index1, row1 in df1.iterrows():
             min_dist = float('inf')
             for index2, row2 in df2.iterrows():
                 dist = calc_euclidean(row1, row2)
                 if dist < min_dist:
                     min_dist = dist
                     min_point = row2
             # replace the closest point in df1 with the corresponding point in df2
             df1.loc[index1] = min_point
      
    4. El dataframe final “revised_df1” tendrá la misma longitud que df1 pero con cuatro puntos de df2 reemplazados.
      revised_df1 = df1
      

    Nota: En caso de un empate (es decir, más de un punto en df1 tiene la misma distancia euclidiana y el valor de distancia es el más bajo), podemos reemplazar cualquier una de las filas al azar.

Comments are closed.