在 Gephi 中打开之前在 Networkx write_graphml 中添加属性
Add attributes in Networkx write_graphml before opening in Gephi
我有一个数据框,其中包含格式为 df = pd.DataFrame(["A", "B", "Count", "some_attribute"])
的可能的网络连接。此数据框表示这样的连接:
- A与B有缘
- 此连接发生 "Count" 次
- 此连接具有特定属性(即特定类型的联系人)
我想将此 Dataframe 导出为 graphml 格式。使用以下代码可以正常工作:
import networkx as nx
G = nx.Graph()
G.add_weighted_edges_from(df[["A", "B", "Count"]].values)
nx.write_graphml(G, "my_graph.graphml")
这段代码生成了一个带有正确图表的 graphml 文件,我可以将其与 Gephi 一起使用。现在我想添加一个属性:
G = nx.Graph()
G.add_weighted_edges_from(df[["A", "B", "Count"]].values, attr=df["some_attribute"].values)
nx.write_graphml(G, "my_graph.graphml")
每当我尝试在此代码中添加属性时,都无法将其写入 graphml 文件。使用此代码,我收到以下错误消息:
NetworkXError: GraphML writer does not support <class 'numpy.ndarray'> as data values.
我找到了相关的文章(比如this一篇),但是没有提供解决这个问题的方法。有没有人有使用 networkx 将属性添加到 graphml 文件的解决方案,以便我可以在 Gephi 中使用它们?
假设随机数据帧:
import pandas as pd
df = pd.DataFrame({'A': [0,1,2,0,0],
'B': [1,2,3,2,3],
'Count': [1,2,5,1,1],
'some_attribute': ['red','blue','red','blue','red']})
A B Count some_attribute
0 0 1 1 red
1 1 2 2 blue
2 2 3 5 red
3 0 2 1 blue
4 0 3 1 red
按照上面的代码实例化一个 Graph
:
import networkx as nx
G = nx.Graph()
G.add_weighted_edges_from(df[["A","B", "Count"]].values, attr=df["some_attribute"].values)
检查边时,似乎 numpy
数组 df['some_attribute'].values
作为属性分配给每个边:
print (G.edge[0][1])
print (G.edge[2][3])
{'attr': array(['red', 'blue', 'red', 'blue', 'red'], dtype=object), 'weight': 1}
{'attr': array(['red', 'blue', 'red', 'blue', 'red'], dtype=object), 'weight': 5}
如果我正确理解了您的意图,我假设您希望每条边的属性对应于 df['some_attribute']
列。
您可能会发现使用 nx.from_pandas_dataframe()
创建 Graph
更容易,尤其是因为您已经将数据格式化为 DataFrame
对象。
G = nx.from_pandas_dataframe(df, 'A', 'B', ['Count', 'some_attribute'])
print (G.edge[0][1])
print (G.edge[2][3])
{'Count': 1, 'some_attribute': 'red'}
{'Count': 5, 'some_attribute': 'red'}
写入文件没有问题:
nx.write_graphml(G,"my_graph.graphml")
除了,我不是 Gephi 的普通用户,所以可能有另一种方法可以解决以下问题。当我加载带有 'Count'
作为边属性的文件时,Gephi 图默认不识别边权重。所以我将列名从 'Count'
更改为 'weight'
并在加载到 Gephi 时看到以下内容:
df.columns=['A', 'B', 'weight', 'some_attribute']
G = nx.from_pandas_dataframe(df, 'A', 'B', ['weight', 'some_attribute'])
nx.write_graphml(G,"my_graph.graphml")
希望这对您有所帮助,希望我正确理解您的问题。
编辑
根据上面 Corley 的评论,如果您选择使用 add_edges_from
,则可以使用以下内容。
G.add_edges_from([(u,v,{'weight': w, 'attr': a}) for u,v,w,a in df[['A', 'B', 'Count', 'some_attribute']].values ])
没有显着的性能提升,但我发现 from_pandas_dataframe
更具可读性。
import numpy as np
df = pd.DataFrame({'A': np.arange(0,1000000),
'B': np.arange(1,1000001),
'Count': np.random.choice(range(10), 1000000, replace=True),
'some_attribute': np.random.choice(['red','blue'], 1000000, replace=True,)})
%%timeit
G = nx.Graph()
G.add_edges_from([(u,v,{'weight': w, 'attr': a}) for u,v,w,a in df[['A', 'B', 'Count', 'some_attribute']].values ])
1 loop, best of 3: 4.23 s per loop
%%timeit
G = nx.Graph()
G = nx.from_pandas_dataframe(df, 'A', 'B', ['Count', 'some_attribute'])
1 loop, best of 3: 3.93 s per loop
我有一个数据框,其中包含格式为 df = pd.DataFrame(["A", "B", "Count", "some_attribute"])
的可能的网络连接。此数据框表示这样的连接:
- A与B有缘
- 此连接发生 "Count" 次
- 此连接具有特定属性(即特定类型的联系人)
我想将此 Dataframe 导出为 graphml 格式。使用以下代码可以正常工作:
import networkx as nx
G = nx.Graph()
G.add_weighted_edges_from(df[["A", "B", "Count"]].values)
nx.write_graphml(G, "my_graph.graphml")
这段代码生成了一个带有正确图表的 graphml 文件,我可以将其与 Gephi 一起使用。现在我想添加一个属性:
G = nx.Graph()
G.add_weighted_edges_from(df[["A", "B", "Count"]].values, attr=df["some_attribute"].values)
nx.write_graphml(G, "my_graph.graphml")
每当我尝试在此代码中添加属性时,都无法将其写入 graphml 文件。使用此代码,我收到以下错误消息:
NetworkXError: GraphML writer does not support <class 'numpy.ndarray'> as data values.
我找到了相关的文章(比如this一篇),但是没有提供解决这个问题的方法。有没有人有使用 networkx 将属性添加到 graphml 文件的解决方案,以便我可以在 Gephi 中使用它们?
假设随机数据帧:
import pandas as pd
df = pd.DataFrame({'A': [0,1,2,0,0],
'B': [1,2,3,2,3],
'Count': [1,2,5,1,1],
'some_attribute': ['red','blue','red','blue','red']})
A B Count some_attribute
0 0 1 1 red
1 1 2 2 blue
2 2 3 5 red
3 0 2 1 blue
4 0 3 1 red
按照上面的代码实例化一个 Graph
:
import networkx as nx
G = nx.Graph()
G.add_weighted_edges_from(df[["A","B", "Count"]].values, attr=df["some_attribute"].values)
检查边时,似乎 numpy
数组 df['some_attribute'].values
作为属性分配给每个边:
print (G.edge[0][1])
print (G.edge[2][3])
{'attr': array(['red', 'blue', 'red', 'blue', 'red'], dtype=object), 'weight': 1}
{'attr': array(['red', 'blue', 'red', 'blue', 'red'], dtype=object), 'weight': 5}
如果我正确理解了您的意图,我假设您希望每条边的属性对应于 df['some_attribute']
列。
您可能会发现使用 nx.from_pandas_dataframe()
创建 Graph
更容易,尤其是因为您已经将数据格式化为 DataFrame
对象。
G = nx.from_pandas_dataframe(df, 'A', 'B', ['Count', 'some_attribute'])
print (G.edge[0][1])
print (G.edge[2][3])
{'Count': 1, 'some_attribute': 'red'}
{'Count': 5, 'some_attribute': 'red'}
写入文件没有问题:
nx.write_graphml(G,"my_graph.graphml")
除了,我不是 Gephi 的普通用户,所以可能有另一种方法可以解决以下问题。当我加载带有 'Count'
作为边属性的文件时,Gephi 图默认不识别边权重。所以我将列名从 'Count'
更改为 'weight'
并在加载到 Gephi 时看到以下内容:
df.columns=['A', 'B', 'weight', 'some_attribute']
G = nx.from_pandas_dataframe(df, 'A', 'B', ['weight', 'some_attribute'])
nx.write_graphml(G,"my_graph.graphml")
希望这对您有所帮助,希望我正确理解您的问题。
编辑
根据上面 Corley 的评论,如果您选择使用 add_edges_from
,则可以使用以下内容。
G.add_edges_from([(u,v,{'weight': w, 'attr': a}) for u,v,w,a in df[['A', 'B', 'Count', 'some_attribute']].values ])
没有显着的性能提升,但我发现 from_pandas_dataframe
更具可读性。
import numpy as np
df = pd.DataFrame({'A': np.arange(0,1000000),
'B': np.arange(1,1000001),
'Count': np.random.choice(range(10), 1000000, replace=True),
'some_attribute': np.random.choice(['red','blue'], 1000000, replace=True,)})
%%timeit
G = nx.Graph()
G.add_edges_from([(u,v,{'weight': w, 'attr': a}) for u,v,w,a in df[['A', 'B', 'Count', 'some_attribute']].values ])
1 loop, best of 3: 4.23 s per loop
%%timeit
G = nx.Graph()
G = nx.from_pandas_dataframe(df, 'A', 'B', ['Count', 'some_attribute'])
1 loop, best of 3: 3.93 s per loop