首先,在開始了與數據框:
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
每個列表都有被轉換成一個集合來有效地找到聯盟。接下來,我們將使用itertools.combinations
在df
創建的所有行的配對組合:
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
現在,應用功能,採取套的團結和發現它的長度。 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
不斷將慢下來了一個檔次。
得到長度獲取表示所有組合成對指數對不起,目前還不清楚你想從第一到第二。 –
@cᴏʟᴅsᴘᴇᴇᴅ將每個元素的列表進行兩兩比較。例如,對於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) –