python - 使用节点行和列位置的字典将 Pandas 边列表转换为稀疏转换矩阵?

标签 python pandas matrix scipy sparse-matrix

我有一个大型数据框,其中包含二分图中的边列表。我想将它转换为 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 个变量 mfinal 以提高可读性,您可以在测试后将其替换为一个):

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/

相关文章:

python - 使用正则表达式在python中的两个字符串之间提取字符串

python - 如果两列之间存在反向,Pandas 会删除重复项

r - 从r中矩阵的每一行中减去常数向量

r - 如何用R提取包含大量0值的列?

python - 自定义 distutils 命令

python - 如何在 Python 的一行用法中合并 f 字符串和 b 字符串

python - 从另一个给定的时间戳开始在 Pandas 系列中创建时间戳序列

python - 计算 pandas 中的 Tf-Idf 分数?

c++ - 在矩阵上赋值

python - Python 3.4 的 HTML 解析器