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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:07:02