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.

Encontrar el punto más cercano de un dataframe sin repetición.

Tengo dos dataframes, df1 y df2.

Quiero encontrar el punto más cercano de df2 correspondiente a los puntos en df1.
Una vez que se selecciona un punto de df2 correspondiente al punto en df1, se debe eliminar del dataframe df2 (para evitar la repetición de puntos en df1) y pasar al siguiente punto en df1.

df1

X Y
0 74.7 30.7
1 74.9 30.7
2 75.1 30.7
3 75.3 30.7
4 75.5 30.7

df2

X Y
0 75.80 33.00
1 75.80 33.00
2 76.40 33.00
3 75.80 33.00
4 76.38 33.00
5 76.45 33.00

Este enlace es bastante cercano, pero para evitar la posibilidad de valores duplicados, ¿cómo se puede devolver el índice del punto más cercano junto con el punto en sí?

Mi código

from scipy.spatial.distance import cdist

def punto_mas_cercano(punto, puntos):
    return cdist([punto], puntos).argmin(), puntos[cdist([punto], puntos).argmin()]

dff1 = pd.DataFrame()
dff2 = pd.DataFrame()
dff1['punto'] = [(x, y) for x,y in zip(df1['Y'], df1['X'])]
dff2['punto'] = [(x, y) for x,y in zip(df2['Y'], df2['X'])]

P = []
for x in dff1['punto']:
    idx,p = punto_mas_cercano(x, list(dff2['punto']))
    P.append(p)
    dff2.drop(idx, inplace=True)

Pero de alguna manera esto no está funcionando.

¿Cómo puedo resolver esto? Por favor, sugiere algunas soluciones.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para devolver el índice del punto más cercano junto con el mismo punto, puedes modificar la función “closest_point” para que devuelva ambos como una tupla. Luego, puedes almacenar el índice en una lista junto con el punto seleccionado en otra lista, y utilizar estas listas para eliminar los puntos seleccionados de “df2”.

    Aquí tienes el código modificado:

    from scipy.spatial.distance import cdist
    
    def closest_point(punto, puntos):
        """Encuentra el punto más cercano de una lista de puntos."""
        idx = cdist([punto], puntos).argmin()
        return idx, puntos[idx]
    
    # Convertir los dataframes en arrays de puntos
    puntos1 = df1[['X', 'Y']].to_numpy()
    puntos2 = df2[['X', 'Y']].to_numpy()
    
    puntos_seleccionados = []
    indices_seleccionados = []
    for punto in puntos1:
        idx, mas_cercano = closest_point(punto, puntos2)
        puntos_seleccionados.append(mas_cercano)
        indices_seleccionados.append(idx)
    
    # Eliminar los puntos seleccionados de df2
    df2 = df2.drop(indices_seleccionados)
    
    # Convertir los puntos seleccionados a un nuevo dataframe llamado df_selected
    df_selected = pd.DataFrame(puntos_seleccionados, columns=['X', 'Y'])
    

    En este código, “puntos1” y “puntos2” son arrays de numpy que contienen los puntos en “df1” y “df2”, respectivamente. La función “closest_point” devuelve tanto el índice como el punto en sí como una tupla. Luego, el código recorre todos los puntos en “df1” y selecciona el punto más cercano de “df2”, eliminándolo de “df2” utilizando la función “drop”. Finalmente, los puntos seleccionados se convierten en un nuevo dataframe llamado “df_selected”.

Comments are closed.