Pandas 用分类和数值混合计算距离矩阵

Pandas 用分类和数值混合计算距离矩阵,pandas,distance,Pandas,Distance,我有一个混合了数字(15个字段)和分类(5个字段)数据的数据框 我可以创建以下数字字段的完整距离矩阵 我还想包括分类字段 用作模板: import scipy from scipy.spatial import distance_matrix from scipy.spatial.distance import squareform from scipy.spatial.distance import pdist df2=pd.DataFrame({'col1':[1,2,3,4],'col2'

我有一个混合了数字(15个字段)和分类(5个字段)数据的数据框

我可以创建以下数字字段的完整距离矩阵

我还想包括分类字段

用作模板:

import scipy
from scipy.spatial import distance_matrix
from scipy.spatial.distance import squareform
from scipy.spatial.distance import pdist
df2=pd.DataFrame({'col1':[1,2,3,4],'col2':[5,6,7,8],'col3':['cat','cat','dog','bird']})
df2
pd.DataFrame(squareform(pdist(df2.values, lambda u, v: np.sqrt((w*(u-v)**2).sum()))), index=df2.index, columns=df2.index)
在方形计算中,我想包括测试
np。其中(u[2]==v[2],0,10)
(以及其他分类列)

Hpw我是否也修改lambda函数以执行此测试

这里是[0,1]之间的距离

= sqrt((2-1)^2 + (6-5)^2 + (cat - cat)^2)
= sqrt(1 + 1 + 0)
以及[0,2]之间的距离

= sqrt((3-1)^2 + (7-5)^2 + (dog - cat)^2)
= sqrt(4 + 4 + 100)
等等

有人能建议我如何实现这个算法吗

import pandas as pd
import numpy as np
from scipy.spatial.distance import pdist, squareform

df2 = pd.DataFrame({'col1':[1,2,3,4],'col2':[5,6,7,8],'col3':['cat','cat','dog','bird']})

def fun(u,v):
    const = 0 if u[2] == v[2] else 10
    return np.sqrt((u[0]-v[0])**2 + (u[1]-v[1])**2 + const**2)

pd.DataFrame(squareform(pdist(df2.values, fun)), index=df2.index, columns=df2.index)
结果:

           0          1          2          3
0   0.000000   1.414214  10.392305  10.862780
1   1.414214   0.000000  10.099505  10.392305
2  10.392305  10.099505   0.000000  10.099505
3  10.862780  10.392305  10.099505   0.000000

我在本地机器上完美地运行了代码,但当我将代码转移到另一台机器上时,我得到了错误:ValueError:无法将字符串转换为float:“bird”关于原因有什么可能的建议吗?在哪一行得到了错误?(在这个例子中:
const=0,如果u[2]==v[2]或者10
?)回溯错误显示:pd.DataFrame(squareform(pdist(df2.values,fun)),index=df2.index,columns=df2.index),那么这归结为pdist(X,metric,p,w,v,VI)中的错误,具体地说是X=\u将u转换为双精度(X)。下一步是_convert_to_double(X)中的错误,特别是def _convert_to_double(X):142如果X.dtype!=np.double:-->143 X=X.astype(np.double)144如果不是X.flags.continuous:145 X=X.copy(),如何在注释部分突出显示代码。ctl+k对我来说并不像在主要部分那样有效。当我做一个循环时,在代码块前放置4个空格也是如此:对于范围内的I(df2.shape[0]):对于范围内的j(df2.shape[0]):如果j