我有以下Pandas DataFrame,包含如下的边缘列表:
name1 name2 weight
0 $hort, Too Alexander, Khandi 0.083333
1 $hort, Too B-Real 0.083333
我想从 Pandas 数据帧中创建一个 igraph 对象(而不是从文件中创建)。由于图形过大,因此我无法将其转换为邻接矩阵。如何处理?
igraph需要元组,pandas提供.itertuples()用于一对:
(source, target, weight(optional))
import pandas as pd
import igraph as ig
g = ig.Graph.TupleList(df.itertuples(index=False), directed=True, weights=True, edge_attrs="weight")
我也在寻找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'])
{v['name']: v.index for v in list(Gm.vs)}
获取igraph顶点索引到名称的映射。 - rlchqrdimport igraph
edgelist = []
weights = []
for i in df.index():
edge = (df.ix[i, 'name1'], df.ix[i, 'name2'])
if edge not in edgelist:
edgelist.append(edge)
weights.append(1)
else:
weights[edgelist.index(edge)] += 1
G = Graph()
G.add_edges(edgelist)
G.es['weight'] = weights
:
for i, row in df.iterrows():
graph.add_edge(row.name1, row.name2, weight=row.weight)
iterrows
返回的是一个元组,所以你需要将其拆开。一种方法是在for循环中指定索引和行对象。我已经更新了我的答案示例以反映这一点。 - kuanbgraph.add_edge()
的文档。我会看一下这个教程:http://igraph.org/python/doc/tutorial/tutorial.html
可能想尝试一些类似于g.add_edges((2,0))
的东西,其中2
和0
是from和to值的id。 - kuanbimport igraph as ig
import pandas as pd
mydata = pd.DataFrame({'name1': ['$hort, Too', '$hort, Too'],
'name2': ['Alexander, Khandi', 'B-Real'],
'weight': [0.083333, 0.083333]})
mygraph = ig.Graph.DataFrame(mydata)