从python中的列表列表构造共现矩阵

从python中的列表列表构造共现矩阵,python,pandas,dataframe,Python,Pandas,Dataframe,假设我们有n个由一些值组成的列表 ['a', 'b'] ['b', 'c', 'd', 'e'] ['a', 'd', 'e'] ['b', 'e'] 这里n=4 这将产生一个如下所示的数据帧 'a' 'b' 'c' 'd' 'e' 'a' 0 1 0 1 1 'b' 1 0 1 1 2 'c' 0 1 0 1 1 'd' 1 1 1 0 2 'e'

假设我们有n个由一些值组成的列表

['a', 'b']
['b', 'c', 'd', 'e']
['a', 'd', 'e']
['b', 'e']
这里n=4

这将产生一个如下所示的数据帧

      'a'  'b'  'c'  'd'  'e'
'a'    0    1    0    1    1
'b'    1    0    1    1    2
'c'    0    1    0    1    1
'd'    1    1    1    0    2
'e'    1    2    1    2    0
您可以使用
get\u dummies
+
groupby
sum
,后跟
dot
产品:

u = (pd.get_dummies(pd.DataFrame(lst), prefix='', prefix_sep='')
       .groupby(level=0, axis=1)
       .sum())

v = u.T.dot(u)
v.values[(np.r_[:len(v)], ) * 2] = 0

print(v)
   a  b  c  d  e
a  0  1  0  1  0
b  1  0  1  1  2
c  0  1  0  1  1
d  1  1  1  0  1
e  0  2  1  1  0

详细信息
首先,加载数据帧

pd.DataFrame(lst)

   0  1     2     3
0  a  b  None  None
1  b  c     d     e
2  a  d  None  None
3  b  e  None  None
接下来,为这些值生成一个热编码。这是计算共现计数的第一步

pd.get_dummies(_, prefix='', prefix_sep='')

   a  b  b  c  d  e  d  e
0  1  0  1  0  0  0  0  0
1  0  1  0  1  0  0  1  1
2  1  0  0  0  1  0  0  0
3  0  1  0  0  0  1  0  0
接下来,按标题组合列并对它们进行计数

_.groupby(level=0, axis=1).sum()

   a  b  c  d  e
0  1  1  0  0  0
1  0  1  1  1  1
2  1  0  0  1  0
3  0  1  0  0  1

u = _
接下来,用点积计算交叉列表

u.T.dot(u)

   a  b  c  d  e
a  2  1  0  1  0
b  1  3  1  1  2
c  0  1  1  1  1
d  1  1  1  2  1
e  0  2  1  1  2

v = _
最后,将对角线设置为0

v.values[(np.r_[:len(v)], ) * 2] = 0
v

   a  b  c  d  e
a  0  1  0  1  0
b  1  0  1  1  2
c  0  1  0  1  1
d  1  1  1  0  1
e  0  2  1  1  0
以下是一种方法:

l1=['a', 'b']
l2=['b', 'c', 'd', 'e']
l3=['a', 'd', 'e']
l4=['b', 'e']
从列表中获取嵌套列表:

l = [i for i in [l1,l2,l3,l4]]
使用以下方法获取每个列表中的所有组合:

展平嵌套列表。请注意,每个元素都是使用
chain.from_iterable((i,i[:-1])
按原始顺序和相反顺序添加的

使用并按
大小进行聚合
从结果生成共现矩阵

df = pd.DataFrame(a)
pd.pivot_table(df, index=0, columns=1, aggfunc='size', fill_value=0)

1    a    b    c    d    e
0                         
a  0.0  1.0  0.0  1.0  1.0
b  1.0  0.0  1.0  1.0  2.0
c  0.0  1.0  0.0  1.0  1.0
d  1.0  1.0  1.0  0.0  2.0
e  1.0  2.0  1.0  2.0  0.0
c = [list(itertools.combinations(i,2)) for i in l]
#[[('a', 'b')],
#[('b', 'c'), ('b', 'd'), ('b', 'e'), ('c', 'd'), ('c', 'e'), ('d', 'e')],
#[('a', 'd'), ('a', 'e'), ('d', 'e')],
#[('b', 'e')]]
a = list(chain.from_iterable((i, i[::-1]) for c_ in c for i in c_))
df = pd.DataFrame(a)
pd.pivot_table(df, index=0, columns=1, aggfunc='size', fill_value=0)

1    a    b    c    d    e
0                         
a  0.0  1.0  0.0  1.0  1.0
b  1.0  0.0  1.0  1.0  2.0
c  0.0  1.0  0.0  1.0  1.0
d  1.0  1.0  1.0  0.0  2.0
e  1.0  2.0  1.0  2.0  0.0