我在弄清楚如何从数据帧中的列向网络中的节点添加属性时遇到麻烦。
我在下面提供了一个数据框示例,共有大约10列,但是在创建网络时我仅使用下面显示的5列。
不幸的是,目前我只能使边缘属性与我的网络一起使用,我这样做如下所示:
g = nx.from_pandas_dataframe(df, 'node_from', 'node_to', edge_attr=['attribute1','attribute2','attribute3'])
Run Code Online (Sandbox Code Playgroud)
该网络将是定向网络。以下数据框中显示的属性是“ node_from”节点的属性。“ node_to”节点有时显示为“ node_from”节点。df_attributes_only表中显示了网络中可能显示的所有节点及其各自的属性。
df_relationship:
node_from: node_to: ........ attribute1: attribute2: attribute3:
jim john ........ tall red fat
...
Run Code Online (Sandbox Code Playgroud)
所有列均以单词作为值,而不是数字。
我还有另一个数据框,其中包含每个可能的节点及其属性:
df_attributes_only:
id: attribute1: attribute2: attribute3:
jim tall red fat
john small blue fat
...
Run Code Online (Sandbox Code Playgroud)
我本质上需要将上述三个属性分配给它们各自的id,因此每个节点都附加了三个属性。
非常感谢您提供有关如何使节点属性与网络一起工作的任何帮助。
从Networkx 2.0开始,您可以输入字典词典nx.set_node_attributes以设置多个节点的属性。与手动遍历每个节点相比,这是一种更加简化的方法。外部词典键代表每个节点,内部词典键对应于要为每个节点设置的属性。像这样:
attr = {
node0: {attr0: val00, attr1: val01},
node1: {attr0: val10, attr1: val11},
node2: {attr0: val20, attr1: val21},
}
Run Code Online (Sandbox Code Playgroud)
以您的示例为例,假设索引为id,则可以将df_attributes_only节点属性的数据框转换为这种格式,然后添加到图形中:
df_attributes_only = pd.DataFrame(
[['jim', 'tall', 'red', 'fat'], ['john', 'small', 'blue', 'fat']],
columns=['id', 'attribute1', 'attribute2', 'attribute3']
)
node_attr = df_attributes_only.set_index('id').to_dict('index')
nx.set_node_attributes(g, node_attr)
g.nodes['jim']
>>> {'attribute1': 'tall', 'attribute2': 'red', 'attribute3': 'fat'}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1161 次 |
| 最近记录: |