1. ホーム
  2. python

[解決済み] Python pandasで共起行列を構築する

2022-02-11 07:01:09

質問

でのやり方は知っています。 R . しかし、データフレームを共起する2つの側面のカウントを含むnxn共起行列に変換するpandasの関数はありません。

例えば行列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

行列は対角線上でミラーリングされているので、コードを最適化する方法があるのでしょう。

どのように解決するのですか?

行列とその転置行列を掛け合わせるだけの簡単な線形代数です(例題には文字列が含まれていますが、整数への変換を忘れないでください)。

>>> 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