关于python:使用字典将节点的行和列位置转换为边缘的熊猫列表以稀疏过渡矩阵?

Convert pandas list of edges to sparse transition matrix with dictionary for nodes row and column positions?

我有一个–大–数据框,其中包含二部图中的边列表。 我想将其转换为python稀疏转换矩阵。

所以我有一个数据框,其中包含将第1部分(a,b,c)中的节点与第(x,y,z)部分相连的边的列表。 边具有多重性:在示例中,从b到y有两个边。

1
2
3
4
5
6
7
start  end  multiplicity
    a    x             1
    a    y             1
    b    y             2
    b    z             1
    c    x             1
    c    z             1

我想要的结果是一个稀疏矩阵,在这种情况下为3x3。 我有第1部分和第2部分的字典,指示哪个节点对应于结果转换矩阵的哪行和哪列:

1
2
dic1 = {'a':0,'b':1,'c':2}
dic2 = {'x':1,'y':0,'z':2}

所以我想要矩阵

1
2
3
4
  y x z
a 1 1 0
b 2 0 1
c 0 1 1

...但稀疏(csr_matrix,lil_matrix或coo_matrix)。 我尝试遍历边缘列表,但是对于长列表来说太慢了。
同样,基于数据透视的方法将生成完整的矩阵,这将很慢并且会消耗内存。
是否有一种有效的方法来获取我想要的稀疏矩阵


据我了解,您可以尝试将pivot + reindexIndex.map(我为可读性添加了两个变量mfinal,可以在测试后将其替换为一个):

1
2
m = df.pivot(*df).fillna(0).rename_axis(index=None,columns=None)
final = m.reindex(index=m.index[m.index.map(dic1)],columns=m.columns[m.columns.map(dic2)])
1
2
3
4
5
6
print(final)

     y    x    z
a  1.0  1.0  0.0
b  2.0  0.0  1.0
c  0.0  1.0  1.0