我有一个大型数据框,其中包含二分图中的边列表。我想将它转换为 python 稀疏转换矩阵。
所以我有一个数据框,其中包含将第 1 部分 (a,b,c) 和部分 (x,y,z) 中的节点链接起来的边列表。边具有多重性:在示例中,从 b 到 y 有两条边。
start end multiplicity
a x 1
a y 1
b y 2
b z 1
c x 1
c z 1
我想要的结果是一个稀疏矩阵,在本例中为 3x3。我有第 1 部分和第 2 部分的字典,指示哪个节点对应于生成的转换矩阵的哪一行和哪列:
dic1 = {'a':0,'b':1,'c':2}
dic2 = {'x':1,'y':0,'z':2}
所以我想要矩阵
y x z
a 1 1 0
b 2 0 1
c 0 1 1
...但在稀疏(csr_matrix、lil_matrix 或 coo_matrix)中。我试过遍历边缘列表,但对于长列表来说太慢了。 此外,基于枢轴的方法将生成完整的矩阵,这将很慢并且会消耗内存。 有没有一种高效的方法可以得到我想要的稀疏矩阵
最佳答案
据我了解,你可以试试 pivot
+ reindex
与 Index.map
(我添加了 2 个变量 m
和 final
以提高可读性,您可以在测试后将其替换为一个):
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)])
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
关于python - 使用节点行和列位置的字典将 Pandas 边列表转换为稀疏转换矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59900354/