我有一个与熊猫一起制作的成对距离数据框:
#Get files
import glob
import itertools
one_dimension = glob.glob('*.pdb')
dataframe = []
for combo in itertools.combinations(one_dimension,2):
pdb_1 = combo[0]
pdb_2 = combo[1]
entry = { 'pdb_1' : pdb_1, 'pdb_2', 'rmsd': get_rmsd(pdb_1,pdb_2)
dataframe.append(entry)
import pandas
dataframe = Dataframe(dataframe)
dataframe
我想要做的就是以一种方式对数据帧进行聚类,其中所有聚类都包含小于某些截止值的pdbs(比方说小于2)。我已经读到完全联系是要走的路。
例如:
所以他们都可以一起出现在一个集群中。但是,如果有任何新的pdb尝试添加到群集中,如果它是> 2对于已在群集中的任何成员,它将被拒绝。
据我所知,这是与截止点的完全联系。
我已经调查了scipy.cluster.hierarchy.linkage,但是我很难格式化数组以进入链接。
完成此任务的最佳方法是什么?
如何从我的数据框架转到可以使用的东西 scipy.cluster?
我应该把它变成R数据帧吗?
如果我转换了,我如何找出群集中的成员 成对距离到阵列。
我发现this,this和this问题类似,并发现this tutorial
根据cel的回答,我可以得到以下结果:
>>df
然后转动
pivot_table = df.pivot('pdb_1','pdb_2','rmsd').fillna(0)
>>pivot_table
然后是数据数组
piv_arr = pivot_table.as_matrix()
dist_mat = piv_arr + np.transpose(piv_arr)
>>dist_mat
但是,我无法制作方格,因为诊断不等于0 ...
>>>squareform(dist_mat)
并且可以验证
>>dist_mat.diagonal()
答案 0 :(得分:1)
这可能对您有用:
这些是我们需要的进口产品:
import scipy.cluster.hierarchy as hcl
from scipy.spatial.distance import squareform
import pandas as pd
import numpy as np
假设我们已经计算了距离矩阵,并决定以这种格式存储距离矩阵的上三角部分:
data = pd.DataFrame({
"a": ["a1", "a1", "a2", "a3", "a2", "a1"],
"b": ["a2", "a3", "a3", "a3", "a2", "a1"],
"distance": [1,2,3, 0, 0, 0]
})
所以这是我们的数据框:
a b distance
0 a1 a2 1
1 a1 a3 2
2 a2 a3 3
3 a3 a3 0
4 a2 a2 0
5 a1 a1 0
使用DataFrame.pivot
,我们可以将数据帧转换为方形距离矩阵:
data_piv = data.pivot("a", "b", "distance").fillna(0)
piv_arr = data_piv.as_matrix()
dist_mat = piv_arr + np.transpose(piv_arr)
这将给我们:
array([[ 0., 1., 2.],
[ 1., 0., 3.],
[ 2., 3., 0.]])
我们可以通过squareform
转换为压缩距离矩阵并输入到链接算法中:
hcl.linkage(squareform(dist_mat))
这为我们提供了以下链接矩阵:
array([[ 0., 1., 1., 2.],
[ 2., 3., 2., 3.]])