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:
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, 5 meses, 5 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 utilizandoresult_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:
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 listanum
. Puedes acceder a las distancias utilizando las etiquetas de las filas del DataFrame original y las matrices de la listanum
.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 buclezip
junto con la funciónscipy.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