如何基于含分组、关联值的DataFrame构建NetworkX边权分组网络可视化
基于给定数据集的清洗与NetworkX共现网络实现
核心目标:将group列的取值作为网络节点,以两个节点共同关联的value值数量作为边的权重(权重越大,连线越粗),完整实现流程如下。
数据清洗流程
- 第一步先去除重复的关联记录:同一
group和value的重复匹配只保留1条,避免重复计数。执行代码:clean_df = df.drop_duplicates(subset=["group", "value"]) - 第二步构建每个分组对应的value集合映射:
按示例数据集计算得到的映射结果:group_value_dict = clean_df.groupby("group")["value"].apply(set).to_dict()A: {'green', 'yellow'}
B: {'blue', 'green', 'orange', 'yellow'}
C: {'pink'}
D: {'black'} - 第三步遍历所有两两分组的组合,计算两个分组的value交集大小,过滤掉交集为0的组合,整理为带权重的边列表:
针对示例数据生成的带权边为:('A', 'B', 2),即A和B共同拥有2个相同的value值。孤立节点C、D无共同关联值,不会生成连接。import itertools node_list = list(group_value_dict.keys()) edge_list = [] for node_u, node_v in itertools.combinations(node_list, 2): common_val_num = len(group_value_dict[node_u] & group_value_dict[node_v]) if common_val_num > 0: edge_list.append((node_u, node_v, common_val_num))
NetworkX 可视化实现
- 导入清洗后的节点和带权边,构建无向图:
import networkx as nx G = nx.Graph() G.add_nodes_from(node_list) G.add_weighted_edges_from(edge_list) - 按照边权映射连线粗细,权重越高线越粗:
line_width = [edge_weight * 2 for _, _, edge_weight in G.edges(data="weight")] - 执行绘图渲染:
import matplotlib.pyplot as plt plt.figure(figsize=(6, 4)) # 固定布局种子保证每次出图位置一致 layout = nx.spring_layout(G, seed=42) # 绘制节点 nx.draw_networkx_nodes(G, layout, node_size=500, node_color="#87CEEB") # 绘制带粗细差异的边 nx.draw_networkx_edges(G, layout, width=line_width, alpha=0.6) # 绘制节点标签 nx.draw_networkx_labels(G, layout, font_size=10) # 关闭坐标轴显示 plt.axis("off") plt.show()
关键注意点:若未提前去重重复的group-value关联,边权会误将value的出现次数计入,导致计算结果偏差。例如示例中B组的green共出现3次,若不去重会导致A-B的共同值计数虚高。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

