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

使用NetworkX构建个体与多虚拟变量关联网络的方法

NetworkX构建个体-虚拟变量二部网络实现方案

原有代码问题

nx.from_pandas_edgelist()的目标节点参数仅支持传入单个列名,无法直接接收虚拟变量列名列表完成多列连边逻辑,不符合二部网络的边生成规则。

实现代码

基础版本(小数据集适用)

逻辑直观易调试,适合万行以内的数据集:

import networkx as nx

# 初始化无向图
G = nx.Graph()

# 替换为你实际使用的虚拟变量列名列表
dummy_variables = ["HSSAFETYX", "HSSMOKEX"]  # 补充所有需要的虚拟变量列名

# 逐行校验虚拟变量取值,生成符合规则的连边
for _, row in df.iterrows():
    person = row["NAME"]
    for col in dummy_variables:
        if row[col] == 1:
            # 节点不存在时add_edge会自动创建,无需提前添加节点
            G.add_edge(person, col)

# 可视化
nx.draw_shell(G, with_labels=True)

优化版本(大数据集适用)

利用pandas表转换替代逐行循环,运行效率提升10倍以上,适合十万行及以上规模数据集:

import networkx as nx
import pandas as pd

dummy_variables = ["HSSAFETYX", "HSSMOKEX"] # 替换为实际虚拟变量列名列表

# 宽表转长表,过滤出取值为1的有效连边记录
edge_list = df.melt(
    id_vars="NAME",
    value_vars=dummy_variables,
    var_name="dummy_node",
    value_name="flag"
).query("flag == 1")[["NAME", "dummy_node"]]

# 直接从边表构建网络
G = nx.from_pandas_edgelist(edge_list, source="NAME", target="dummy_node")

nx.draw_shell(G, with_labels=True)

效果说明

  • 网络包含两类独立节点:一类是NAME列对应的个体节点,一类是虚拟变量列名对应的属性节点
  • 连边严格遵循规则:仅当个体在某虚拟变量上取值为1时,才会在对应个体节点和虚拟变量节点间生成连边,取值为0的组合不会产生连边

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 22:15:48