Power BI中使用NetworkX绘制网络图的三类技术问题
Power BI中NetworkX使用问题的解决方案
问题1:移除空白节点
空白节点的出现源于数据中空的目标节点,之前用math.isnan()失效是因为空值可能是字符串空值而非数值NaN,改用pandas.isna()可覆盖所有空值类型,提供两种处理方式:
- 创建图前清理数据:直接删除包含空目标节点的行
import pandas as pd # 移除目标节点为空的行 dataset = dataset.dropna(subset=["NodeName.1"]) # 基于清理后的数据创建图 G = nx.from_pandas_edgelist(dataset, source="NodeName", target="NodeName.1")
- 创建图后移除空节点:遍历图节点,筛选并移除所有空值节点
import pandas as pd import networkx as nx G = nx.from_pandas_edgelist(dataset, source="NodeName", target="NodeName.1") # 筛选所有空值节点 null_nodes = [node for node in G.nodes() if pd.isna(node)] # 批量移除空节点 G.remove_nodes_from(null_nodes)
问题2:绘制有向图
要生成有向图,需在创建图时指定create_using=nx.DiGraph(),箭头样式是绘图阶段的参数,而非创建图的参数,之前的错误是参数位置放错。
正确代码:
import networkx as nx import matplotlib.pyplot as plt # 创建有向图对象 G = nx.from_pandas_edgelist(dataset, source="NodeName", target="NodeName.1", create_using=nx.DiGraph()) # 绘制带箭头的有向图,设置箭头样式和大小 nx.draw_networkx(G, with_labels=True, arrows=True, arrowstyle='->', arrowsize=15) plt.show()
问题3:筛选后显示完整上下游路径
要显示筛选节点的完整上下游路径,需提取包含该节点所有可达节点(上游祖先+下游后代)的子图,具体实现:
import pandas as pd import networkx as nx import matplotlib.pyplot as plt # 创建有向图 G = nx.from_pandas_edgelist(dataset, source="NodeName", target="NodeName.1", create_using=nx.DiGraph()) # 提取当前筛选后的所有有效节点(合并源/目标节点,去重去空) filtered_nodes = pd.concat([dataset["NodeName"], dataset["NodeName.1"]]).dropna().unique() # 定义函数,获取节点的所有上下游可达节点 def get_full_path_nodes(graph, start_nodes): full_nodes = set() for node in start_nodes: full_nodes.add(node) # 添加所有下游节点 full_nodes.update(nx.descendants(graph, node)) # 添加所有上游节点 full_nodes.update(nx.ancestors(graph, node)) return list(full_nodes) # 获取完整路径的节点集合 path_nodes = get_full_path_nodes(G, filtered_nodes) # 提取子图 sub_graph = G.subgraph(path_nodes) # 绘制子图 nx.draw_networkx(sub_graph, with_labels=True, arrows=True, arrowstyle='->', arrowsize=15) plt.show()
原理:通过nx.descendants()和nx.ancestors()分别获取节点的下游、上游节点,将这些节点组合成子图,即可显示完整的上下游路径,同时自动排除无关节点。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

