首先,从数据框开始:
from itertools import combinations
df = pd.DataFrame({
'Col1': [['Green','Red','Purple'],
['Red', 'Yellow', 'Blue'],
['Brown', 'Green', 'Yellow', 'Blue']]
}, index=['A', 'B', 'C'])
df['Col1'] = df['Col1'].apply(set)
df
Col1
A {Purple, Red, Green}
B {Red, Blue, Yellow}
C {Green, Yellow, Blue, Brown}
中的每个列表Col1
都已转换为一个集合以有效地找到联合。接下来,我们将用于itertools.combinations
创建 中所有行的成对组合df
:
df1 = pd.DataFrame(
data=list(combinations(df.index.tolist(), 2)),
columns=['Src', 'Dst'])
df1
Src Dst
0 A B
1 A C
2 B C
现在,应用一个函数来获取集合的并集并找到它的长度。Src
和Dst
列充当对 的查找df
。
df1['Weights'] = df1.apply(lambda x: len(
df.loc[x['Src']]['Col1'].intersection(df.loc[x['Dst']]['Col1'])), axis=1)
df1
Src Dst Weights
0 A B 1
1 A C 1
2 B C 2
我建议在一开始就设置转换。每次即时将您的列表转换为一组既昂贵又浪费。
为了加快速度,您可能还希望将集合复制到新数据框中的两列中,因为df.loc
不断调用会使它减慢一个档次。