【问题标题】:Create a Network based on a specific string column inside dataframe根据数据框中的特定字符串列创建网络
【发布时间】:2021-11-29 00:05:35
【问题描述】:

我有一个如下图所示的数据框:

但是当我想创建这个网络时遇到了一些麻烦。 我使用了这段代码:

G = nx.complete_graph(df.Members)
list(G.edges())

但我得到了错误。 我的问题是如何根据这种类型的数据创建这个网络。我应该提到每个组都是一个完整的图表,我想将这些组组合成一个。此外,我有一些空白区域会导致一些重复的节点。

【问题讨论】:

  • 您需要以如此漂亮的方式绘制图形,还是您的目标只是用数据构建图形对象?我问是因为这是两个非常不同的问题,难度也非常不同。
  • 另外,您的目标是自己学习如何做,还是尽快解决问题并继续前进?
  • 但是如果你能按照你的方法解决,我很感激。

标签: pandas list graph networkx removing-whitespace


【解决方案1】:

用你的格式来绘制它本身至少是另一个 SO 问题,所以我坚持按照你展示的方式大致解析数据,生成一个图表,然后做一个粗略的绘图。这是下面代码块的结果:

从绘图格式的角度来看,我所做的只是

  1. 包括节点标签
  2. 固定节点 B、C、F 和 J 的位置
  3. 稍微调整一下nx.spring_layout() 参数,让情节更容易辨认。
import pandas as pd
import networkx as nx


d = {'Group Name': {1: 'Alpha', 2: 'Beta', 3: 'Gamma', 4: 'Omega'}, 'Members': {1: 'A, B, C', 2: 'C, D, E, F', 3: 'F, G, H, I, J', 4: 'J, K, L,M,N, O'}, 'Weight': {1: 'W1', 2: 'W2', 3: 'W3', 4: 'W4'}}
df = pd.DataFrame.from_dict(d)

subgraphs = []
for record in df.to_records():
    nodes = [node.strip() for node in record[2].split(",")]
    subgraph = nx.complete_graph(nodes)
    nx.set_edge_attributes(subgraph, record[3], name='Weight')
    subgraphs.append(subgraph)

G = nx.compose_all(subgraphs)

node_types = {'A': 1, 'B': 1, 'C':2, 'D': 1, 'E': 2, 'F': 1, 'G': 1, 'H': 1, 'I': 2, 'J': 2, 'K': 1, 'L': 1, 'M': 2, 'N': 1, 'O': 1}
nx.set_node_attributes(G, node_types, name='Type')

pos_fixed = {'B': (1, 0),
             'C': (2, 0),
             'F': (3, 0),
             'J': (4, 0),
             'K': (5, 0)}

pos = nx.spring_layout(G, k=1.25, pos=pos_fixed, fixed=pos_fixed.keys(), seed=42)

nx.draw(G, pos, with_labels=True)

【讨论】:

  • 谢谢,是否可以将节点类型和边权重添加到该 for 循环以将这些数据附加到最终图?
  • @Hadi 我更新了答案以反映您的反馈。在迭代每个子图时可以传递边权重。由于节点类型在它们自己的数据结构中,我只是在构建图形后将它们全部添加。对于未来涉及提供表格数据或数据框的问题,绝对值得阅读How to make good reproducible pandas examples
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 2017-03-18
  • 2022-08-10
  • 1970-01-01
  • 2017-10-21
  • 2022-12-15
  • 2019-08-06
  • 1970-01-01
相关资源
最近更新 更多