Matriks cooccurence dari pandas dataframe

Aug 26 2020

Masalah

Saya memiliki bingkai data panda, dan saya perlu menghitung berapa banyak baris yang ada di mana setiap entri unik dalam kerangka data terjadi dalam baris yang sama dari setiap entri lainnya.


Posting terkait tetapi berbeda

  • Matriks Kemunculan Bersama dari daftar kata dengan Python : Pertanyaan serupa dengan saya, tetapi tidak dimulai dengan kerangka data. Sebagian besar jawaban menggunakan iterasi. Saya berharap ada solusi yang lebih baik di Panda.
  • Membangun matriks kejadian bersama dalam python pandas : Ini sudah dimulai dengan kerangka data di mana hanya ada 0 dan 1 di tubuh (saya kira mewakili nilai sebenarnya?) Tetapi bukan nilai sebenarnya.
  • Ubah bingkai data dua kolom menjadi matriks kejadian di panda : Posting ini mengasumsikan hanya ada dua kolom, yang agak membatasi untuk kasus yang dibahas di sini

Penyiapan yang Dapat Direproduksi

import pandas as pd
import numpy as np

Kerangka data:

df = pd.DataFrame({'a': ['A', 'A', 'B', 'B'],
                   'b': ['B', 'C', 'B', 'B'],
                   'c': ['C', 'A', 'C', 'A'],
                   'd': ['B', 'D', 'B', 'A']},
                   index=[0, 1, 2, 3])

yaitu:

+----+-----+-----+-----+-----+
|    | a   | b   | c   | d   |
|----+-----+-----+-----+-----|
|  0 | A   | B   | C   | B   |
|  1 | A   | C   | A   | D   |
|  2 | B   | B   | C   | B   |
|  3 | B   | B   | A   | A   |
+----+-----+-----+-----+-----+

(Dicetak menggunakan ini .)


Apa yang telah saya coba

Saya telah mencoba menggunakan kode dari jawaban , & mengganti variabel ini:

document = [list(each) for each in df.values]
names = list(np.unique(df.values))

Itu memberikan hasil yang salah:

  A B C D
A 4 6 3 2
B 6 10 5 0
C 3 5 0 1
D 2 0 1 0

Ini berdasarkan iterasi, jadi saya berharap ada solusi yang lebih baik.


Output yang Diharapkan

+----+-----+-----+-----+-----+
|    |   A |   B |   C |   D |
|----+-----+-----+-----+-----|
| A  | nan |   2 |   2 |   1 |
| B  |   2 | nan |   2 |   0 |
| C  |   2 |   2 | nan |   1 |
| D  |   1 |   0 |   1 | nan |
+----+-----+-----+-----+-----+

Ada 2baris di mana A& Bkeduanya muncul, jadi nilai di Akolom baris sel Badalah 2. Ada 2baris di mana A& Ckeduanya muncul, jadi nilai di Akolom baris sel Cadalah 2.


Pertanyaan

Bagaimana saya bisa mendapatkan matriks cooccurence bijaksana baris ini dengan mudah di Pandas? Akan lebih bagus jika saya tidak harus mengulang-ulang nilainya.


( pandas.Categorical mungkin ada gunanya, saya belum berhasil membuatnya berfungsi.)

Jawaban

1 BENY Aug 26 2020 at 20:34

KAMI dapat melakukan stackitu get_dummiesdan dotkemudian menghargai

s=df.stack().str.get_dummies().sum(level=0).ne(0).astype(int)
s=s.T.dot(s).astype(float)
np.fill_diagonal(s.values, np.nan)
s
Out[33]: 
     A    B    C    D
A  NaN  2.0  2.0  1.0
B  2.0  NaN  2.0  0.0
C  2.0  2.0  NaN  1.0
D  1.0  0.0  1.0  NaN