如何在 pandas 中创建邻接矩阵,以便在重新排列行和列时保留标签
How to create an adjacency matrix in pandas such that the labels are preserved when rows and cols are rearranged
我以前从未为此目的使用过 pandas 或 numpy,我想知道 在 pandas 中构造标记邻接矩阵的惯用方法是什么。
我的数据与此类似。每种 "uL22"
类型的东西都是一种蛋白质,数组是这种蛋白质的邻居。因此(在下面的这个例子中)邻接矩阵将在 bL31
行、uL5
列中有 1,反之亦然
我的问题是双重的:
邻接矩阵的实际维度由一组蛋白质名称决定,通常比 nbrtree
中包含的蛋白质名称大得多,所以我想知道什么是最好的将我的 nbrtree
数据映射到该集合的方法,比如 100
by 100
矩阵对应于 100
蛋白质的邻域关系。
我不太确定如何将这 100 种蛋白质的名称(即 uL32
等)"bind" 到该矩阵的行和列中,这样当我开始相应地移动名称周围的行。 (我打算将邻接矩阵重新排列成块对角线结构)
"nbrtree": {
"bL31": ["uL5"],
"uL5": ["bL31"],
"bL32": ["uL22"],
"uL22": ["bL32","bL17"],
...
"bL33": ["bL35"],
"bL35": ["bL33","uL15"],
"uL13": ["bL20"],
"bL20": ["uL13","bL21"]
}
>>>len(nbrtree)
>>>40
我确定这是人们每天都在进行的操作,我只是不太熟悉数据帧的正常运行方式,所以我可能正在寻找一些非常明显的东西。
非常感谢!
我不完全理解你的问题,但从我得到的尝试这段代码。
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
注意这里的邻接矩阵不对称因为我已经获取了一些随机数据
要将您的标签吸收到数据框中,请更改为以下内容
data = pd.DataFrame(0, index = ['index']+col, columns = ['column']+col, dtype = int)
data.loc['index'] = [0]+col
data.loc[:, 'column'] = ['*']+col
我以前从未为此目的使用过 pandas 或 numpy,我想知道 在 pandas 中构造标记邻接矩阵的惯用方法是什么。
我的数据与此类似。每种 "uL22"
类型的东西都是一种蛋白质,数组是这种蛋白质的邻居。因此(在下面的这个例子中)邻接矩阵将在 bL31
行、uL5
列中有 1,反之亦然
我的问题是双重的:
邻接矩阵的实际维度由一组蛋白质名称决定,通常比
nbrtree
中包含的蛋白质名称大得多,所以我想知道什么是最好的将我的nbrtree
数据映射到该集合的方法,比如100
by100
矩阵对应于100
蛋白质的邻域关系。我不太确定如何将这 100 种蛋白质的名称(即
uL32
等)"bind" 到该矩阵的行和列中,这样当我开始相应地移动名称周围的行。 (我打算将邻接矩阵重新排列成块对角线结构)
"nbrtree": {
"bL31": ["uL5"],
"uL5": ["bL31"],
"bL32": ["uL22"],
"uL22": ["bL32","bL17"],
...
"bL33": ["bL35"],
"bL35": ["bL33","uL15"],
"uL13": ["bL20"],
"bL20": ["uL13","bL21"]
}
>>>len(nbrtree)
>>>40
我确定这是人们每天都在进行的操作,我只是不太熟悉数据帧的正常运行方式,所以我可能正在寻找一些非常明显的东西。 非常感谢!
我不完全理解你的问题,但从我得到的尝试这段代码。
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
注意这里的邻接矩阵不对称因为我已经获取了一些随机数据
要将您的标签吸收到数据框中,请更改为以下内容
data = pd.DataFrame(0, index = ['index']+col, columns = ['column']+col, dtype = int)
data.loc['index'] = [0]+col
data.loc[:, 'column'] = ['*']+col