首页 > 解决方案 > 如何在python中创建有效的共现?

问题描述

我正在尝试在 python 中创建一个共现矩阵,但正在寻找一些有效的方法来做到这一点。

我的数据集如下所示:

total_labels = ['a','b','c','d']

occ = [['a','b'],['c','d'],['a','c'],['d'],['a','c','d']]

我期待这样的输出:

data_mat = [[0, 1 , 2, 1],
            [1, 0,  0, 0],
            [2, 0,  0, 2],
            [1, 0,  2, 0]]

这实际上是:

               a  b   c  d
data_mat = a [[0, 1 , 2, 1],
            b [1, 0,  0, 0],
            c [2, 0,  0, 2],
            d [1, 0,  2, 0]]

我尝试过的是:

import numpy as np

m_matrix = np.zeros([4,4])

for m in range(len(total_labels)):
    for j in range(len(total_labels)):
        for k in occ:
            if set((total_labels[m],total_labels[j])).issubset(set(k)):
                m_matrix[m,j]+=1

这是给:

array([[3., 1., 2., 1.],
       [1., 1., 0., 0.],
       [2., 0., 3., 2.],
       [1., 0., 2., 3.]])

但是正如您所看到的, (a,a) 和 (b,b) 等( self loops )之间没有联系,但它在那里给出了值。

如何在不使用许多循环的情况下创建 data_mat?

标签: pythonpython-3.xpandaslist

解决方案


merge跟随crosstab

import pandas as pd
df = pd.DataFrame(occ).stack().rename('val').reset_index().drop(columns='level_1')

df = df.merge(df, on='level_0').query('val_x != val_y')
pd.crosstab(df.val_x, df.val_y)

输出:

val_y  a  b  c  d
val_x            
a      0  1  2  1
b      1  0  0  0
c      2  0  0  2
d      1  0  2  0

如果只需要您提供的那些标签,则可以:

(pd.crosstab(df.val_x, df.val_y)
     .reindex(total_labels, axis=0).reindex(total_labels, axis=1))

或者在合并之前过滤(可能更聪明):

df = df.loc[df.val.isin(total_labels)]

推荐阅读