You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于DataFrame构建权重>0.2的NetworkX有向图?

解决方法

首先明确你的DataFrame结构,下面分两种常见场景给出完整实现:

场景1:DataFrame是邻接矩阵格式(行和列都是节点,单元格值为权重)

假设你的DataFrame df 的行索引和列名都是节点标识,单元格值是对应节点间的权重:

import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd

G = nx.DiGraph() 

# 添加节点:用行索引作为节点标识
nodes = df.index.tolist()
G.add_nodes_from(nodes)

# 添加符合条件的边:遍历所有节点对,权重>0.2则添加
for u in nodes:
    for v in nodes:
        weight = df.loc[u, v]
        if weight > 0.2 and u != v:  # 可根据需求去掉u!=v保留自环
            G.add_edge(u, v, weight=weight)

# 绘图执行
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, node_size=100)
nx.draw_networkx_labels(G, pos, font_size=10, font_family='sans-serif')
edges = G.edges()
weights = [G[u][v]['weight'] for u, v in edges]
nx.draw_networkx_edges(G, pos, edgelist=edges, width=weights)
plt.axis('off')
plt.show()

场景2:DataFrame是长格式(包含from_node、to_node、weight列)

如果你的DataFrame包含出发节点、目标节点、权重三列:

import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd

G = nx.DiGraph() 

# 添加节点:合并出发/目标节点的唯一值
nodes = pd.concat([df['from_node'], df['to_node']]).unique().tolist()
G.add_nodes_from(nodes)

# 添加符合条件的边:筛选权重>0.2的行批量添加
filtered_edges = df[df['weight'] > 0.2]
for _, row in filtered_edges.iterrows():
    G.add_edge(row['from_node'], row['to_node'], weight=row['weight'])

# 绘图执行(和上方一致)
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, node_size=100)
nx.draw_networkx_labels(G, pos, font_size=10, font_family='sans-serif')
edges = G.edges()
weights = [G[u][v]['weight'] for u, v in edges]
nx.draw_networkx_edges(G, pos, edgelist=edges, width=weights)
plt.axis('off')
plt.show()

关键注意点:

  • 确保节点标识在DataFrame中格式统一(均为字符串或数字)
  • 添加边时必须传入weight属性,否则后续提取权重会报错
  • 可根据需求选择是否保留节点自环

内容的提问来源于stack exchange,提问作者sylvia_zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 07:17:42