に名前を付ける列を変更:
In [823]: from itertools import combinations
In [824]: df = pd.DataFrame({'Col1': [['Green','Red','Purple'], ['Red', 'Yellow', 'Blue'], ['Brown', 'Green', 'Yellow', 'Blue']]}, index=['A',
...: 'B', 'C'])
In [827]: df['Col1'] = df.Col1.apply(lambda x: set(x))
In [828]: df
Out[828]:
Col1
A {Purple, Red, Green}
B {Red, Blue, Yellow}
C {Green, Yellow, Blue, Brown}
各リストはCol1
にしています効率的に組合を見つけるための集合に変換されました。 、今
In [845]: df1 = pd.DataFrame(data=list(combinations(df.index.tolist(), 2)), columns=['Src', 'Dst'])
In [849]: df1
Out[849]:
Src Dst
0 A B
1 A C
2 B C
和集合を取ると、その長さを見つけるための機能を適用します。次に、我々はdf
内のすべての行の対の組み合わせを作成するためにitertools.combinations
を使用します。 Src
とDst
の列は、df
のルックアップとして機能します。
In [859]: df1['Weights'] = df1.apply(lambda x: len(df.loc[x['Src']]['Col1'].intersection(df.loc[x['Dst']]['Col1'])), axis=1)
In [860]: df1
Out[860]:
Src Dst Weights
0 A B 1
1 A C 1
2 B C 2
私は最初のアドバイス設定変換を行います。毎回あなたのリストをセットに変換するのは、費用がかかり、無駄です。より高速化のために
、おそらくもにしたいと思います@Wenを行っているとして常にdf.loc
を呼び出すとノッチそれが遅くなりますので、新しいデータフレーム内の2つの列にセットをコピーします。
を介して長さを取得する
np.triu_indices
&
演算子を使用して、すべての組み合わせを表すペアワイズインデックスを得ます申し訳ありませんが、最初から2番目にどのようにしたいのかは不明です。 –@cᴏʟᴅseach各要素のリストはペアごとに比較されます。例えば、A-Bの場合、要素は共通の要素(赤色)を持ちます。したがって、Source-A Target-B行の重みは1です。合計で、新しいデータフレームは元のデータフレーム行のすべてのペアごとの組み合わせを持ちます。 – Melsauce
あなたは28kの要素を言うとき、行/ノードを意味しますか?その場合は、すべての組み合わせ生成アプローチを実行するとかなり大規模になります(https://www.google.com/search?q=28000+choose+2&oq=28000+cho&aqs=chrome.0.69i59j69i57j0)。6150j0j8&sourceid = chrome&ie = UTF-8) –