Как создать матрицу смежности в pandas, чтобы метки сохранялись при перестановке строк и столбцов - PullRequest
0 голосов
/ 17 апреля 2020

Я никогда раньше не использовал pandas или numpy для этой цели и мне интересно каков идиоматический c способ построения помеченных матриц смежности в pandas.

Мои данные имеют форму, подобную этой. Каждый тип "uL22" является белком, а массивы - соседями этого белка. Следовательно (в этом примере ниже) матрица смежности будет иметь 1 с в строке bL31, столбце uL5, и наоборот, et c.

Моя проблема двоякая:

  1. Фактическое измерение матрицы смежности продиктовано набором имен белков, которые обычно намного больше, чем те, которые содержатся в nbrtree, поэтому мне интересно, как лучше всего отобразить мою nbrtree данные для этого набора, скажем, матрица 100 по 100, соответствующая отношениям соседства белков 100.

  2. Я не совсем уверен, как "связать" имена (то есть uL32 et c.) этих 100 белков в строках и столбцах этой матрицы, так что, когда я начинаю перемещать строки вокруг имен, перемещаются соответственно. (Я планирую перестроить матрицу смежности, чтобы она имела блочно-диагональную структуру)

"nbrtree": {
        "bL31": ["uL5"],
        "uL5": ["bL31"],
        "bL32": ["uL22"],
        "uL22": ["bL32","bL17"],
         ...
        "bL33": ["bL35"],
        "bL35": ["bL33","uL15"],
        "uL13": ["bL20"],
        "bL20": ["uL13","bL21"]
}
>>>len(nbrtree)
>>>40

Я уверен, что это манипуляция, которую люди выполняют ежедневно, я просто не совсем знаком с тем, как функционируют кадры данных, поэтому я, наверное, ищу что-то очень очевидное. Большое вам спасибо!

1 Ответ

1 голос
/ 17 апреля 2020

Я не совсем понимаю ваш вопрос, но из того, что я получаю, попробуйте этот код.

from pprint import pprint as pp
import pandas as pd
dic = {"first": {
        "a": ["b","d"],
        "b": ["a","h"],
        "c": ["d"],
        "d": ["c","g"],
        "e": ["f"],
        "f": ["e","d"],
        "g": ["h","a"],
        "h": ["g","b"]
}}
col = list(dic['first'].keys())
data = pd.DataFrame(0, index = col, columns = col, dtype = int)
for x,y in dic['first'].items():
        data.loc[x,y] = 1
pp(data)

Вывод этого кода:

   a  b  c  d  e  f  g  h
a  0  1  0  1  0  0  0  0
b  1  0  0  0  0  0  0  1
c  0  0  0  1  0  0  0  0
d  0  0  1  0  0  0  1  0
e  0  0  0  0  0  1  0  0
f  0  0  0  1  1  0  0  0
g  1  0  0  0  0  0  0  1
h  0  1  0  0  0  0  1  0

Примечание что эта смежная матрица здесь не симметрична c, поскольку я взял случайные данные

Чтобы включить ваши метки в кадр данных, перейдите к следующему

data = pd.DataFrame(0, index = ['index']+col, columns = ['column']+col, dtype = int)
data.loc['index'] = [0]+col
data.loc[:, 'column'] = ['*']+col
...