从熊猫数据帧创建 igraph Graph

leo*_*ank 7 python igraph pandas

我有以下熊猫数据框包含一个边缘列表如下:

        name1              name2    weight
0  $hort, Too  Alexander, Khandi  0.083333
1  $hort, Too             B-Real  0.083333
Run Code Online (Sandbox Code Playgroud)

我想从熊猫数据帧(而不是从文件)创建一个 igraph 对象。该图太大,因此我无法将其转换为邻接矩阵。怎么做?

Emm*_*Nej 8

我也在 igraph 中寻找 Networkx from_pandas_dataframe 的等效函数,我发现使用 Graph.TupleList() 作为最佳解决方案。所以基本上你从 3 个 Pandas 列创建一个元组,然后使用这个函数来创建网络。

tuples = [tuple(x) for x in df.values]
Gm = igraph.Graph.TupleList(tuples, directed = True, edge_attrs = ['weight'])
Run Code Online (Sandbox Code Playgroud)


Veg*_*ega 7

igraph 需要元组,pandas 为一对提供了 .itertuples():

(source, target, weight(optional))
Run Code Online (Sandbox Code Playgroud)

假设您的数据框被命名为“df”,您可以通过以下方式从熊猫数据框中获得一个带有权重的有向图对象:

import pandas as pd
import igraph as ig

g = ig.Graph.TupleList(df.itertuples(index=False), directed=True, weights=True, edge_attrs="weight")
Run Code Online (Sandbox Code Playgroud)

根据https://igraph.org/python/doc/igraph.Graph-class.html#TupleList

weights - 指定图形加权的替代方法。如果您将权重设置为 true 且未给出 edge_attrs,则将假定 edge_attrs 为 ["weight"] 并且 igraph 会将每个项目的第三个元素解析为边权重

因此,在您的情况下,您不需要“edge_attrs=”,但我添加它只是为了提供更通用的解决方案。


kua*_*anb 1

只是草图/伪代码,但是怎么样:

for i, row in df.iterrows():
    graph.add_edge(row.name1, row.name2, weight=row.weight)
Run Code Online (Sandbox Code Playgroud)