如何将DataFrame转换为NetworkX图:索引为源、列为目标且非零值为权重
将DataFrame转换为带权重的NetworkX有向图
要实现你需要的映射逻辑,得先把宽格式的DataFrame转成长格式(每行对应一条潜在边),过滤掉权重为0的行后,再用NetworkX的API构建图。你的示例代码存在两处问题:一是df.column应为df.columns,二是nx.from_pandas_edgelist仅支持长格式DataFrame,直接传入宽表会触发错误。
完整实现步骤与代码:
import pandas as pd import numpy as np import networkx as nx # 生成示例DataFrame df = pd.DataFrame(np.random.randint(0,3,size=(4, 4)), columns=list('ABCD'), index=list('ABCD')) print("原始DataFrame:") print(df) # 1. 将宽表转成长格式,提取源节点、目标节点、权重 edge_df = df.stack().reset_index() edge_df.columns = ['source', 'target', 'weight'] # 2. 过滤掉权重为0的无效边 edge_df = edge_df[edge_df['weight'] != 0] # 3. 构建带权重的有向图 G = nx.from_pandas_edgelist( edge_df, source='source', target='target', edge_attr='weight', # 保留权重作为边属性 create_using=nx.DiGraph() ) # 验证输出:打印所有边及对应权重 print("\n图中有效边及权重:") for u, v, attrs in G.edges(data=True): print(f"{u} → {v}, 权重: {attrs['weight']}")
关键细节说明:
df.stack()会将原DataFrame的列名转换为二级索引,结合reset_index()就能得到包含**源节点(原索引)、目标节点(原列名)、权重(单元格值)**的标准边表。edge_attr='weight'参数会把边表中的权重值存入图的边属性中,后续可通过G[u][v]['weight']直接调用。- 若需构建无向图,只需将
create_using=nx.DiGraph()替换为create_using=nx.Graph()即可。
内容的提问来源于stack exchange,提问作者sam47
相关产品推荐
相关产品推荐

