เมทริกซ์ Cooccurence จากดาต้าเฟรมแพนด้า

Aug 26 2020

ปัญหา

ฉันมีดาต้าเฟรมของแพนด้าและฉันต้องนับว่ามีกี่แถวที่แต่ละรายการที่ไม่ซ้ำกันในดาต้าเฟรมเกิดขึ้นภายในแถวเดียวกันของแต่ละรายการ


โพสต์ที่เกี่ยวข้อง แต่ต่างกัน

  • เมทริกซ์ร่วมที่เกิดขึ้นจากรายการคำใน Python : คำถามที่คล้ายกันกับของฉัน แต่ไม่ได้ขึ้นต้นด้วยดาต้าเฟรม คำตอบส่วนใหญ่ใช้การวนซ้ำ ฉันหวังว่าจะมีทางออกที่ดีกว่าในนุ่น
  • การสร้างเมทริกซ์ร่วมที่เกิดขึ้นในไพ ธ อนแพนด้า : สิ่งนี้เริ่มต้นด้วยดาต้าเฟรมที่มีเพียง 0 และ 1 ในร่างกาย (ฉันเดาว่าแสดงถึงค่าจริง?) แต่ไม่ใช่ค่าจริง
  • แปลงกรอบข้อมูลสองคอลัมน์เป็นเมทริกซ์ที่เกิดขึ้นในแพนด้า : โพสต์นี้ถือว่ามีสองคอลัมน์เท่านั้นซึ่งค่อนข้าง จำกัด สำหรับกรณีที่กล่าวถึงที่นี่

การตั้งค่าที่ทำซ้ำได้

import pandas as pd
import numpy as np

ดาต้าเฟรม:

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

กล่าวคือ:

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

(พิมพ์โดยใช้สิ่งนี้ )


สิ่งที่ฉันได้ลอง

ฉันได้พยายามใช้รหัสจากคำตอบ & แทนที่ตัวแปรเหล่านี้:

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

มันให้ผลลัพธ์ที่ผิด:

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

มันขึ้นอยู่กับการทำซ้ำดังนั้นฉันหวังว่าจะได้ทางออกที่ดีกว่านี้


ผลลัพธ์ที่คาดหวัง

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

มี2แถวที่AและBทั้งสองจะปรากฏเพื่อให้ค่าในเซลล์แถวAคอลัมน์คือB 2มี2แถวที่AและCทั้งสองจะปรากฏเพื่อให้ค่าในเซลล์แถวAคอลัมน์คือC2


คำถาม

ฉันจะได้เมทริกซ์ cooccurence แบบแถวนี้อย่างง่ายดายใน Pandas ได้อย่างไร จะดีมากถ้าไม่ต้องวนซ้ำค่าต่างๆ


( หมีแพนด้าหมวดหมู่อาจจะใช้งานได้ฉันยังไม่สามารถทำให้มันใช้งานได้)

คำตอบ

1 BENY Aug 26 2020 at 20:34

ที่เราสามารถทำได้stackแล้วget_dummiesและdotคุ้มค่าแล้ว

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