如何基于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
相关产品推荐
相关产品推荐

