Python 每两行的数据帧组合

Python 每两行的数据帧组合,python,pandas,cluster-analysis,Python,Pandas,Cluster Analysis,我正在实现一个聚类算法,它需要计算每对数据点之间的距离,其中每个数据点作为一行存储在pd.Dataframe中。总的计算量按O(n^2)的顺序增长,为了有效地计算,我必须谨慎 做我想做的事的有效方法是什么 假设一个数据帧中有4个数据点: #<inputtable tin> Id Label 0 Michael 1 Jim 2 Pam 3 Dwight 我所做的: 我尝试使用pd.merge为表生成笛卡尔积 data = pd.DataFram

我正在实现一个聚类算法,它需要计算每对数据点之间的距离,其中每个数据点作为一行存储在pd.Dataframe中。总的计算量按O(n^2)的顺序增长,为了有效地计算,我必须谨慎

做我想做的事的有效方法是什么

假设一个数据帧中有4个数据点:

#<inputtable tin>
Id    Label 
0     Michael
1     Jim
2     Pam
3     Dwight
我所做的:

我尝试使用pd.merge为表生成笛卡尔积

data = pd.DataFrame([[0, 'Michael'], [1, 'Jim'], [2, 'Pam'], [3, 'Dwight']], columns=['Id', 'Label'])
data['tmp'] = 1
result = pd.merge(data, data, left_on='tmp', right_on='tmp')
result = result[result['Id_x'] != result['Id_y']]
print result
然而,这看起来真的像是一个围绕合并的黑客攻击,我也尝试了itertools和combination,但这对熊猫不太有效


有谁知道一种更有效的方法可以通过定制的相似距离函数来完成这种“聚类工作”?我还计划在Gephi中分析这一点,我不知道总体上是否有更好的解决方案

首先
我不能解决O(n^2)问题

itertools.composition

from itertools import combinations

labels = df.Label.values.tolist()

f = lambda x, y: x + y

pd.Series({k: f(*k) for k in combinations(labels, 2)})
labels = df.Label.values

f = lambda x, y: x + y

i, j = np.triu_indices(labels.size, 1)

combs = list(zip(labels[i], labels[j]))

pd.MultiIndex.from_tuples(combs).to_series().apply(lambda t: f(*t))
np.triu\u索引

from itertools import combinations

labels = df.Label.values.tolist()

f = lambda x, y: x + y

pd.Series({k: f(*k) for k in combinations(labels, 2)})
labels = df.Label.values

f = lambda x, y: x + y

i, j = np.triu_indices(labels.size, 1)

combs = list(zip(labels[i], labels[j]))

pd.MultiIndex.from_tuples(combs).to_series().apply(lambda t: f(*t))