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

如何基于含分组、关联值的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的组合,整理为带权重的边列表:
    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))
    
    针对示例数据生成的带权边为:('A', 'B', 2),即A和B共同拥有2个相同的value值。孤立节点C、D无共同关联值,不会生成连接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 19:06:05