【问题标题】:Create NetworkX graph from Pandas DataFrame从 Pandas DataFrame 创建 NetworkX 图
【发布时间】:2018-08-01 17:42:17
【问题描述】:

我刚刚开始编码,并试图了解 NetworkX 的工作原理。我有一个包含文档和主题列的 Pandas DataFrame。 topics 列指示每个文档(行)中是否存在主题。

df = pd.DataFrame({'DOC': ['Doc_A', 'Doc_B', 'Doc_C', 'Doc_D', 'Doc_E'], 'topic_A': [0,0,1,0,0], 'topic_B': [1,0,0,1,0], 'topic_C': [0,1,1,1,0]})

    DOC     topic_A topic_B topic_C
0   Doc_A   0       1       0
1   Doc_B   0       0       1
2   Doc_C   1       0       1
3   Doc_D   0       1       1
4   Doc_E   0       0       0

我想做的是创建以下网络:

1) 文档是节点,边是主题(没有权重),所以同一个节点有多个边。

2) 文档是节点,边是主题,但不是有多条边,而是根据它们共有多少个主题来对边进行加权。

我该怎么做?我在这里的想法是否正确?

【问题讨论】:

  • 您有一条只有一个节点的边 (Topic_A)。边应该有两个节点。我认为您的数据框不会生成有效的网络。不过我可能错了。
  • 我知道,但我不明白如何从这些事件中创建边缘!
  • 在图论中,边只存在于两个节点之间。所以,你不能有一个你称之为边缘的主题,它至少有两个文档。
  • 我想这可能是X-Y problem
  • 谢谢斯科特,我明白你的意思了。我将尝试重新表述:如何创建一个表格,其中文档中主题的共现表示为边?

标签: python pandas networkx


【解决方案1】:

以下是构建网络的方法,在该网络中,文档中主题的共现表示为边:

首先将 DOC 设为索引并堆叠数据框。您会得到表格的线性表示:

stacked = df.set_index('DOC').stack()
#DOC           
#Doc_A  topic_A    0
#       topic_B    1
#       topic_C    0
#...

当然,您只需要包含 1 的行,因为 1 表示主题和文档是相连的:

stacked = stacked[stacked==1]

这个表的多索引其实是一个边列表:

edges = stacked.index.tolist()
#[('Doc_A', 'topic_B'), ('Doc_B', 'topic_C'), ('Doc_C', 'topic_A'),
# ('Doc_C', 'topic_C'), ('Doc_D', 'topic_B'), ('Doc_D', 'topic_C')]

让我们用它建立一个网络。新图是二分图。您可以将其投影以保留 topicx 但丢弃 documentx - 或相反:

G = nx.Graph(edges)
Gp = nx.bipartite.project(G,df.set_index('DOC').columns)
# or
# nx.bipartite.project(G,df.set_index('DOC').index)
Gp.edges()
#EdgeView([('topic_A', 'topic_C'), ('topic_B', 'topic_C')])

后跟shameless piece of self-promotion

【讨论】:

    猜你喜欢
    • 2014-02-08
    • 2021-08-17
    • 2020-09-26
    • 2019-07-08
    • 2021-11-26
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多