我有以下Pandas DataFrame:
In [31]: import pandas as pd sample = pd.DataFrame({'Sym1': ['a','a','a','d'],'Sym2':['a','c','b','b'],'Sym3':['a','c','b','d'],'Sym4':['b','b','b','a']},index=['Item1','Item2','Item3','Item4']) In [32]: print(sample) Out [32]: Sym1 Sym2 Sym3 Sym4 Item1 a a a b Item2 a c c b Item3 a b b b Item4 d b d a
我想找到一种优雅的方法来Item
根据这个距离矩阵得到每个距离:
In [34]: DistMatrix = pd.DataFrame({'a': [0,0,0.67,1.34],'b':[0,0,0,0.67],'c':[0.67,0,0,0],'d':[1.34,0.67,0,0]},index=['a','b','c','d']) print(DistMatrix) Out[34]: a b c d a 0.00 0.00 0.67 1.34 b 0.00 0.00 0.00 0.67 c 0.67 0.00 0.00 0.00 d 1.34 0.67 0.00 0.00
例如Item1
,Item2
将比较aaab
- > accb
- 使用距离矩阵,这将是0+0.67+0.67+0=1.34
理想输出:
Item1 Item2 Item3 Item4 Item1 0 1.34 0 2.68 Item2 1.34 0 0 1.34 Item3 0 0 0 2.01 Item4 2.68 1.34 2.01 0
shadowtalker.. 21
这是一个老问题,但有一个Scipy函数可以做到这一点:
from scipy.spatial.distance import pdist, squareform distances = pdist(sample.values, metric='euclidean') dist_matrix = squareform(distances)
pdist
在Numpy矩阵上运行,并且DataFrame.values
是数据框的基础Numpy NDarray表示.该metric
参数允许您选择几个内置距离度量中的一个,或者您可以传入任何二进制函数以使用自定义距离.这是非常强大的,根据我的经验,非常快.结果是一个"平面"数组,它只包含距离矩阵的上三角形(因为它是对称的),不包括对角线(因为它总是为0).squareform
然后将这种扁平形式翻译成一个完整的矩阵.
该文档有更多的信息,其中包括了许多内置的距离函数的数学纲要.
这是一个老问题,但有一个Scipy函数可以做到这一点:
from scipy.spatial.distance import pdist, squareform distances = pdist(sample.values, metric='euclidean') dist_matrix = squareform(distances)
pdist
在Numpy矩阵上运行,并且DataFrame.values
是数据框的基础Numpy NDarray表示.该metric
参数允许您选择几个内置距离度量中的一个,或者您可以传入任何二进制函数以使用自定义距离.这是非常强大的,根据我的经验,非常快.结果是一个"平面"数组,它只包含距离矩阵的上三角形(因为它是对称的),不包括对角线(因为它总是为0).squareform
然后将这种扁平形式翻译成一个完整的矩阵.
该文档有更多的信息,其中包括了许多内置的距离函数的数学纲要.