Python/Pandas 基于父子关系表构建根节点与各function对应序列号DataFrame
实现思路
- 先整理全量节点和对应function的映射关系,去重避免重复计算
- 构建子节点到父节点的映射字典,用于快速查找任意节点的根节点
- 给每个节点标记对应的根节点
- 直接透视表即可得到目标结构
完整可运行代码
import pandas as pd import numpy as np # 示例输入 df = pd.DataFrame( [['001', '010', 'A', 'B'], ['001', '020', 'A', 'C'], ['010', '100', 'B', 'D'], ['100', '110', 'D', 'E'], ['002', '030', 'A', 'B'], ['002', '040', 'A', 'C']], columns=['parent_serialno', 'child_serialno', 'parent_function', 'child_function'] ) # 整理所有节点与对应function的映射 parent_nodes = df[['parent_serialno', 'parent_function']].rename(columns={ 'parent_serialno': 'serialno', 'parent_function': 'function' }) child_nodes = df[['child_serialno', 'child_function']].rename(columns={ 'child_serialno': 'serialno', 'child_function': 'function' }) all_nodes = pd.concat([parent_nodes, child_nodes]).drop_duplicates() # 构建子节点→父节点的映射字典 child_to_parent = dict(zip(df['child_serialno'], df['parent_serialno'])) # 定义查找根节点的函数 def find_root(node): while node in child_to_parent: node = child_to_parent[node] return node # 给每个节点标记所属根节点 all_nodes['root'] = all_nodes['serialno'].apply(find_root) # 透视得到最终结果 result = all_nodes.pivot(index='root', columns='function', values='serialno').reset_index(drop=True) print(result)
输出结果
A B C D E 0 001 010 020 100 110 1 002 030 040 NaN NaN
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

