Scipy sparse matrix from edge list
<p>How to convert an <strong><em>edge list</em></strong> (<a href="https://i.stack.imgur.com/EdpiK.png" rel="nofollow noreferrer">data</a>) to a python <strong><em>scipy sparse matrix</em></strong> to get this result: </p>

<p><a href="https://i.stack.imgur.com/ZPQIB.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ZPQIB.png" alt="sparse matrix in R"></a></p>

<p>Dataset (where 'agn' is node category one and 'fct' is node category two):</p>

<pre><code>data['agn'].tolist()
['p1', 'p1', 'p1', 'p1', 'p1', 'p2', 'p2', 'p2', 'p2', 'p3', 'p3', 'p3', 'p4', 'p4', 'p5']

data['fct'].tolist()
['f1', 'f2', 'f3', 'f4', 'f5', 'f3', 'f4', 'f5', 'f6', 'f5', 'f6', 'f7', 'f7', 'f8', 'f9']
</code></pre>

<p>(not working) python code:</p>

<pre><code>from scipy.sparse import csr_matrix, coo_matrix

csr_matrix((data_sub['agn'].values, data['fct'].values), 
                    shape=(len(set(data['agn'].values)), len(set(data_sub['fct'].values))))
</code></pre>

<p>-> <strong>Error</strong>: "TypeError: invalid input format"
Do I really need three arrays to construct the matrix, like the examples in the scipy csr documentation do suggest (can only use two links, sorry!)?</p>

<p>(working) R code used to construct the matrix with only two vectors:</p>

<pre><code>library(Matrix)

grph_tim &lt;- sparseMatrix(i = as.numeric(data$agn), 
                     j = as.numeric(data$fct),  
                     dims = c(length(levels(data$agn)),
                              length(levels(data$fct))),
                     dimnames = list(levels(data$agn),
                                     levels(data$fct)))
</code></pre>

<hr>

<p><strong>EDIT</strong>:
It finally worked after I modified the code from <a href="https://stackoverflow.com/questions/38688062/converting-a-1-2gb-list-of-edges-into-a-sparse-matrix">here</a> and added the needed array:</p>

<pre><code>import numpy as np
import pandas as pd
import scipy.sparse as ss

def read_data_file_as_coo_matrix(filename='edges.txt'):
    "Read data file and return sparse matrix in coordinate format."

    # if the nodes are integers, use 'dtype = np.uint32'
    data = pd.read_csv(filename, sep = '\t', encoding = 'utf-8')

    # where 'rows' is node category one and 'cols' node category 2
    rows = data['agn']  # Not a copy, just a reference.
    cols = data['fct']

    # crucial third array in python, which can be left out in r
    ones = np.ones(len(rows), np.uint32)
    matrix = ss.coo_matrix((ones, (rows, cols)))
    return matrix
</code></pre>

<p>Additionally, I converted the string names of the nodes to integers. Thus <code>data['agn']</code> becomes <code>[0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4]</code> and <code>data['fct']</code> becomes <code>[0, 1, 2, 3, 4, 2, 3, 4, 5, 4, 5, 6, 6, 7, 8]</code>.</p>

<p>I get this sparse matrix:</p>

<blockquote>
  <p>(0, 0)  1
    (0, 1)    1
    (0, 2)    1
    (0, 3)    1
    (0, 4)    1
    (1, 2)    1
    (1, 3)    1
    (1, 4)    1
    (1, 5)    1
    (2, 4)    1
    (2, 5)    1
    (2, 6)    1
    (3, 6)    1
    (3, 7)    1
    (4, 8)    1</p>
</blockquote>