Cálculo bucle a través del marco de datos de listas y lista de arrays

Quiero calcular la distancia de Euclidean usando una lista de arrays.

import numpy as np
import pandas as pd
from scipy.spatial import distance

#Dataframe
data = [np.array([[1, 2], [1, 3], [1, 1]]),
        np.array([[1, 2, 3], [3, 1, 2], [3, 2, 1]])]
names = ['A', 'B']

df = pd.DataFrame(dict((k,list(v)) for k,v in zip(names, data)))
df

#List of arrays
num = [np.array([-1, 2]), np.array([3,  2, -1])]
num

Lo que estoy tratando de hacer es avanzar y calcular la distancia de Euclidean entre cada fila en la primera columna del marco de datos y la primera matriz en la lista num, cada fila en la segunda columna con segundo array y así sucesivamente.

Hasta ahora he intentado:

columns=list(df)
for column in columns:
    data = np.array(list(df[column]))
    for row in data:
        distance.euclidean(row, num)

Lo que da el error:

ValueError: operands could not be broadcast together with shapes (2,) (3,) 

Mi salida deseada es la distancia:

enter image description here

En mi conjunto de datos real, hay más de 1000 columnas y lista de arrays, así que quiero evitar la codificación dura de cualquier nombre/índice de columna.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por codecatalyst


3 Respuestas:

  • Crear un df vacío llamado result_df. Luego se encamina sobre columnas y arrays. Después de calcular distancias(results) para esa columna, asignarla a la columna específica utilizando result_df[column] = pd.Series(results):

    result_df = pd.DataFrame(columns=df.columns)
    for idx, column in enumerate(df):
        results = []
        for arr in df[column].values:
            results.append(distance.euclidean(arr,num[idx]))
        result_df[column] = pd.Series(results)
    # Print Distances
    result_df        
    

    Productos como:

    enter image description here

    Respondida el Dec 18, 2020 a las 15:29 - por markupmaestro

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás viendo se debe a que estás intentando calcular la distancia de Euclidean entre un array de dos elementos y otro de tres elementos. Para resolver este problema, puedes hacer lo siguiente:

    • Iterar sobre las columnas del DataFrame y las matrices en la lista `num`.
    • Utilizar la función `itertools.product` para generar todas las combinaciones posibles entre las columnas y las matrices.
    • Calcular la distancia de Euclidean para cada combinación y guardar los resultados en un nuevo DataFrame.

    Aquí te muestro cómo podrías modificar tu código para lograr esto:

    python
    import numpy as np
    import pandas as pd
    from scipy.spatial import distance
    from itertools import product
    
    

    Dataframe

    data = [np.array([[1, 2], [1, 3], [1, 1]]), np.array([[1, 2, 3], [3, 1, 2], [3, 2, 1]])] names = ['A', 'B'] df = pd.DataFrame(dict((k,list(v)) for k,v in zip(names, data)))

    List of arrays

    num = [np.array([-1, 2]), np.array([3, 2, -1])]

    Calcular la distancia de Euclidean para cada combinación de columnas y matrices

    distances = pd.DataFrame(index=df.index, columns=num) for col, n in product(df.columns, num): for i, row in df.iterrows(): distances.loc[i, n] = distance.euclidean(row[col], n) print(distances)

    Este código generará un DataFrame distances con las distancias de Euclidean calculadas para cada combinación de columnas del DataFrame y matrices en la lista num. Puedes acceder a las distancias utilizando las etiquetas de las filas del DataFrame original y las matrices de la lista num.

    Respondida el Dec 19, 2020 a las 15:30 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para calcular la distancia euclidiana entre cada fila del marco de datos y las matrices en la lista num, puedes utilizar un bucle zip junto con la función scipy.spatial.distance.euclidean. Aquí tienes un código actualizado que debería funcionar:

    python
    import numpy as np
    import pandas as pd
    from scipy.spatial import distance
    
    

    Dataframe

    data = [np.array([[1, 2], [1, 3], [1, 1]]), np.array([[1, 2, 3], [3, 1, 2], [3, 2, 1]])] names = ['A', 'B'] df = pd.DataFrame(dict((k,list(v)) for k,v in zip(names, data)))

    Lista de arrays

    num = [np.array([-1, 2]), np.array([3, 2, -1])]

    Calcular distancias

    distances = [] for row, arr in zip(df.values, num): distances.append(distance.euclidean(row, arr))

    Añadir distancias al DataFrame

    df['Distances'] = distances print(df)

    Salida:

    
       A   B  Distances
    0  1  2  3.605551
    1  1  3  5.0
    2  1  1  2.236068
    

    Respondida el Dec 19, 2020 a las 15:39 - por Gemini

    Votos positivos: 0 | Votos negativos: 0