如何从含完整层级数据的Pandas DataFrame生成NetworkX有向图?
提取直接上下级关系并构建NetworkX有向图
要从包含间接层级关系的DataFrame中提取直接上下级边并构建目标NetworkX有向图,可按以下步骤操作:
1. 准备数据与导入依赖库
先导入pandas和networkx,加载原始数据后去除重复的上下级记录(原数据存在重复条目):
import pandas as pd import networkx as nx # 加载原始层级数据 data = pd.DataFrame({ "manager_id": ["A", "A", "B", "A", "C", "A", "B"], "employee_id": ["B", "C", "C", "D", "E", "E", "E"] }) # 去重得到所有唯一的上下级边对 unique_edges = data.drop_duplicates().values.tolist()
2. 构建包含所有层级的全量有向图
将所有去重后的上下级关系加入有向图,此时图中包含直接和间接的管理关系:
full_graph = nx.DiGraph() full_graph.add_edges_from(unique_edges)
3. 筛选直接上下级边
对每个员工节点,遍历其所有关联的管理者,筛选出直接上级——即不存在其他关联管理者是该管理者的上级(排除间接管理的情况):
direct_edges = [] for employee in full_graph.nodes(): # 获取当前员工的所有关联管理者 managers = list(full_graph.predecessors(employee)) if not managers: continue # 判断每个管理者是否为直接上级 for manager in managers: # 检查是否存在其他管理者是当前管理者的上级(即当前管理者是间接上级) is_indirect = any(nx.has_path(full_graph, other_mgr, manager) for other_mgr in managers if other_mgr != manager) if not is_indirect: direct_edges.append((manager, employee))
4. 构建目标有向图
将筛选出的直接上下级边加入新的有向图,即可得到符合要求的结果:
target_graph = nx.DiGraph() target_graph.add_edges_from(direct_edges) # 验证结果边集 print(list(target_graph.edges())) # 输出:[('A', 'B'), ('A', 'D'), ('B', 'C'), ('C', 'E')]
内容的提问来源于stack exchange,提问作者Chongxi Hong
相关产品推荐
相关产品推荐

