python - 来自 Pandas Edgelist 数据帧的无向图的邻接矩阵

标签 python pandas numpy dataframe

data1 = { 'node1': [1,1,1,2],
     'node2': [2,3,5,4],
     'weight': [1,1,1,1], }
df1 = pd.DataFrame(data1, columns = ['node1','node2','weight'])

我想从 pandas 数据帧创建一个邻接矩阵。该数据帧具有无向图的边列表

输出:

0 1 1 0 1
1 0 0 1 0
1 0 0 0 0
0 1 0 0 0
1 0 0 0 0

我的代码:

def adjmat():
    print 'begun creating adjen mat'
    data = sc.loadtxt('training.csv', dtype='str', delimiter=',',skiprows=1)
    data = sc.transpose(data)
    row1 = data[1].astype(int)
    row2 = data[2].astype(int)
    weight=data[3].astype(int)
    n=0
    n1=0
    n2=0


    n1=max(row1)
    n2=max(row2)

    if n1>n2:

        Amat=sc.zeros((n1,n1))
        #matrix=sc.zeros((n1,n1))
        n=n1


    else:
        Amat=sc.zeros((n2,n2))
        #matrix=sc.zeros((n2,n2))
        n=n2


    for i in range(0,len(row1)):

        row=row1[i]
        col=row2[i]

        Amat[row-1][col-1]=weight[i]

    i_lower = np.tril_indices(n, -1)
    Amat[i_lower] = Amat.T[i_lower]



    return Amat 

我正在寻找可扩展的代码。现在我正在处理具有 100,000 个节点的数据集,并且此代码无法处理如此大的数据集。

最佳答案

Using networkx.....

data1 = { 'node1': [1,1,1,2],
 'node2': [2,3,5,4],
 'weight': [1,1,1,1], }
df1 = pd.DataFrame(data1, columns = ['node1','node2','weight'])       
G=nx.from_pandas_dataframe(df1,'node1','node2','weight')

Adjtraining = nx.adjacency_matrix(G)

print Adjtraining.todense()

output

[[0 1 1 0 1]
 [1 0 0 1 0]
 [1 0 0 0 0]
 [0 1 0 0 0]
 [1 0 0 0 0]]

关于python - 来自 Pandas Edgelist 数据帧的无向图的邻接矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47602655/

相关文章:

python - 创建唯一的Id,读取多个文件时枚举不同的行值

python - Numpy:获取索引大于值且条件为真的数组

python - Pandas:列名包含特殊字符的查询字符串

Python - 写入文本文件,但它们显示为空?

python - str.encode 期望输入什么?

python - 将数组转换为正指标

python - 更改多行数组的numpy矢量化方式(行可以重复)

python - 循环元素时如何解决 StaleElementReferenceException (Selenium)

python - 使用 Python 3.x 在 Pandas 中使用零和常量值扩展/填充时间序列数据

python - 使用 Python statsmodel 进行多元线性回归