将含重叠键的嵌套字典转换为NetworkX带权有向网络遇阻
解决带权有向网络构建及DataFrame生成问题
问题根源分析
- 字典赋值覆盖:原循环中每次遍历子节点时,都通过
dNotFinalAfterAll[x]={item:forthelasttime.count(item)}直接赋值,会完全覆盖之前的键值对,最终只保留最后一次循环的结果。 - 重复低效计数:用
list.count(item)在循环内反复统计,既浪费性能,又会输出大量重复条目。
修复与实现步骤
1. 高效统计节点权重
借助collections.Counter一次性统计每个主节点对应子节点的出现频次,避免重复计算和数据覆盖。
2. 构建完整权重字典
将统计结果整理为{主节点: {子节点: 权重}}的格式,确保所有边的权重信息被完整保留。
3. 生成带权有向图
基于整理好的权重字典批量添加边,解决单一边输出的问题。
4. 转换为结构化DataFrame
从图的边数据中提取信息,生成可用于后续分析的DataFrame。
完整代码实现
import networkx as nx from collections import Counter import pandas as pd compiledDict = {'A': ['A_1', 'A_2', 'A_3', 'A_4', 'A_5', 'A_6'], 'B': ['B_1', 'B_2', 'B_3', 'B_2', 'B_4', 'B_5', 'B_1', 'B_6', 'B_4']} # 统计每个主节点对应的子节点权重 weight_dict = {} for main_node, sub_nodes in compiledDict.items(): sub_counts = Counter(sub_nodes) weight_dict[main_node] = sub_counts # 构建带权有向图 G2 = nx.DiGraph() for main_node, sub_weights in weight_dict.items(): for sub_node, weight in sub_weights.items(): G2.add_edge(main_node, sub_node, weight=weight) # 验证边信息 print("带权边列表:") for s, t, w in G2.edges(data=True): print(f"{s} -> {t}, 权重: {w['weight']}") # 转换为DataFrame edge_records = [] for s, t, w in G2.edges(data=True): edge_records.append({ '源节点': s, '目标节点': t, '权重': w['weight'] }) edge_df = pd.DataFrame(edge_records) print("\n生成的DataFrame:") print(edge_df)
输出说明
- 带权边列表会输出所有正确的边及对应权重,例如
B -> B_1, 权重: 2、A -> A_1, 权重: 1等,无重复或缺失。 - DataFrame以表格形式展示源节点、目标节点、权重三列,结构清晰,支持后续数据分析或可视化操作。
内容的提问来源于stack exchange,提问作者William Ashlin
相关产品推荐
相关产品推荐

