在python pandas中构造共现矩阵

发布于 2021-01-29 19:27:39

我知道如何在R中执行此操作。但是,熊猫中是否有任何函数可以将数据帧转换为包含两个同时出现的计数的nxn同时出现矩阵。

例如矩阵df:

import pandas as pd

df = pd.DataFrame({'TFD' : ['AA', 'SL', 'BB', 'D0', 'Dk', 'FF'],
                    'Snack' : ['1', '0', '1', '1', '0', '0'],
                    'Trans' : ['1', '1', '1', '0', '0', '1'],
                    'Dop' : ['1', '0', '1', '0', '1', '1']}).set_index('TFD')

print df

>>> 
    Dop Snack Trans
TFD                
AA    1     1     1
SL    0     0     1
BB    1     1     1
D0    0     1     0
Dk    1     0     0
FF    1     0     1

[6 rows x 3 columns]

将产生:

    Dop Snack Trans

Dop   0     2     3
Snack 2     0     2
Trans 3     2     0

由于矩阵是在对角线上镜像的,所以我想会有一种优化代码的方法。

关注者
0
被浏览
180
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是一个简单的线性代数,您将矩阵与其转置相乘(您的示例包含字符串,请不要忘记将它们转换为整数):

    >>> df_asint = df.astype(int)
    >>> coocc = df_asint.T.dot(df_asint)
    >>> coocc
           Dop  Snack  Trans
    Dop      4      2      3
    Snack    2      3      2
    Trans    3      2      4
    

    如果像R答案中一样,如果您想重设对角线,则可以使用numpy的fill_diagonal

    >>> import numpy as np
    >>> np.fill_diagonal(coocc.values, 0)
    >>> coocc
           Dop  Snack  Trans
    Dop      0      2      3
    Snack    2      0      2
    Trans    3      2      0
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看