使用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
相关产品推荐
相关产品推荐

