python - networkx - 以 block 的形式读取边缘列表(pandas)

标签 python pandas networkx

我有一个非常大的网络需要在 Networkx 中读取和分析(大约 5 亿行),存储在 gzip 加权边缘列表中(Node1 Node2 权重)。到目前为止,我尝试阅读它:

# Open and Read File
with gzip.open(network,'rb') as fh:
    # Read Weighted Edge List
    G = nx.read_weighted_edgelist(fh, create_using=nx.DiGraph())

但由于它非常大,我遇到了一些内存问题。我想知道是否有一种方法可以沿着固定长度的 block 以“pandas”样式读取文件。感谢您的帮助。

编辑:

这是我的边缘列表文件的一小部分提取(Node1 Node2 权重):

30879005 5242 11
44608582 2295986 4
24935102 737450 1
42230925 1801294 1
20926179 2332390 1
40959246 1100438 1
3291058 3226104 1
23192021 5818064 1
16328715 7695005 1
11561383 2102983 1
1886716 1378893 2
23192021 5818065 1
2060097 2060091 1
7176482 3222203 2
46586813 1599030 1
35151866 35151866 1
12420680 1364416 5
612044 92878 1
16260783 3373725 1
26475759 85310 1
21149725 17011789 1
1312990 105320 1
23898296 1633222 3
3635610 2103011 1
12737940 4114680 1
18210502 10816500 1
45999903 45999903 1
8689446 1977413 1
5998987 3453478 3

最佳答案

将 csv 数据读入 pandas df:

df = pd.read_csv(path_to_edge_list, sep='\s+', header=None, names=['Node1','Node2','Weight'])

现在创建一个 nx 有向图并执行列表理解来生成以(node1,node2,权重)作为数据的元组列表:

In [150]:

import networkx as nx
G = nx.DiGraph()
G.add_weighted_edges_from([tuple(x) for x in df.values])
G.edges()
Out[150]:
[(16328715, 7695005),
 (42230925, 1801294),
 (40959246, 1100438),
 (12737940, 4114680),
 (3635610, 2103011),
 (16260783, 3373725),
 (45999903, 45999903),
 (7176482, 3222203),
 (8689446, 1977413),
 (11561383, 2102983),
 (21149725, 17011789),
 (18210502, 10816500),
 (3291058, 3226104),
 (23898296, 1633222),
 (46586813, 1599030),
 (2060097, 2060091),
 (5998987, 3453478),
 (44608582, 2295986),
 (12420680, 1364416),
 (612044, 92878),
 (30879005, 5242),
 (23192021, 5818064),
 (23192021, 5818065),
 (1312990, 105320),
 (20926179, 2332390),
 (26475759, 85310),
 (24935102, 737450),
 (35151866, 35151866),
 (1886716, 1378893)]

证明我们有权重属性:

In [153]:

G.get_edge_data(30879005,5242)
Out[153]:
{'weight': 11}

要读取 block 中的边列表,请在 read_csv 中设置 chunksize 参数,并使用上述代码为每个 block 添加边和权重。

编辑

因此,要分块读取,您可以这样做:

import networkx as nx
G = nx.DiGraph()
for d in pd.read_csv(path_to_edge_list,sep='\s+', header=None, names=['Node1', 'Node2', 'Weight'], chunksize=10000):
    G.add_weighted_edges_from([tuple(x) for x in d.values])

关于python - networkx - 以 block 的形式读取边缘列表(pandas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29102744/

相关文章:

python - 在 python 中我应该使用 try 还是 If ,为什么?

python - 将自定义类别分配给 json 数据 - pandas

algorithm - 不能满足所有需求的最小成本的最大流量

python - 将networkx图转换为flare json

python - SciPy:稀疏数据的 n 维插值

python - 使用 python 从字符串中获取电子邮件 ID 的最佳方法

python - 为什么 SQLAlchemy 不更新 Flask WSGI 服务器中的行值?

python - 如何比较具有相同列但不同行数的两个数据框?

python - 基于三列将一个 Pandas 数据框中的行与另一个数据框匹配

python - 如何将 Networkx 中的两条边和节点组合成一个具有公共(public)起始节点的边和节点?