2017-05-25 16 views
1

各データポイントがpd.Dataframeの行として格納されるすべてのデータポイントペア間の距離の計算を必要とするクラスタリングアルゴリズムを実装しています。計算全体がO(n^2)の順に大きくなります。これを効率的に行うには慎重でなければなりません。2つの行のパンダデータフレームの組み合わせ

私がしたいことを効率的に行う方法は何ですか?

私はデータフレーム内の4つのデータポイントを持っていると言う:

#<inputtable tin> 
Id Label 
0  Michael 
1  Jim 
2  Pam 
3  Dwight 

そして、私はすべての2点コンビネーション(2,4)間の割引を計算するためにカスタマイズされた機能 similar(x,y)を実行する必要がある〜6と私の出力すべきです私がやっていること

#<outputtable tout> 
Source_Id Source_Label To_Id To_Label distance 
0   Michael   1  Jim   f('Michael', 'Jim') 
0   Michael   2  Pam   f('Michael', 'Pam') 
0   Michael   3  Dwight  f('Michael', 'Dwight') 
1   Jim    2  Pam   f('Jim', 'Pam') 
1   Jim    3  Dwight  f('Jim', 'Dwight') 
2   Pam    3  Dwight  f('Pam', '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を試してみました。

カスタマイズされた類似距離関数を使用してこのような「クラスタリング作業」を行う方が効率的な方法を知っている人は誰ですか?また、一般的にはよりよい解決策があるかどうかわからないGephiの分析も予定しています。

答えて

1

まず
Iは、O(N^2)問題を解決することができません。

itertools.combination

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)}) 

np.triu_indices

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)) 
関連する問題