如何使用Python/Pandas基于工作分解结构(WBS)为数据框生成父/子标记列
判断WBS编号的父级/子项标记方案
咱们先从你给出的示例里提炼出核心规则:如果一个WBS编号存在直接的下一级子条目(也就是有其他WBS以它为前缀,格式为当前WBS.xxx),那它就是Parent;如果没有任何子条目,就标记为Child。
基于这个规则,我们可以用Pandas快速实现这个逻辑,下面是具体的代码步骤:
1. 构造示例数据
首先把你提供的示例数据转换成DataFrame:
import pandas as pd data = { "WBS #": [ "1", "1.1", "1.1.1", "1.1.2", "1.1.2.1", "1.1.2.1.1", "1.1.2.1.1.1", "1.1.2.1.1.2", "1.1.2.1.2", "1.1.2.1.3", "1.1.2.2" ] } df = pd.DataFrame(data)
2. 实现父级判断逻辑
写一个简单的辅助函数检查每个WBS是否存在子项,再用apply方法给每行添加标记:
def has_child(wbs, all_wbs): # 构造子项的前缀格式:当前WBS + 英文点号 child_pattern = f"{wbs}." # 检查所有WBS中是否有符合这个前缀的条目 return any(item.startswith(child_pattern) for item in all_wbs) # 生成Parent/Child列 df["Parent/Child"] = df["WBS #"].apply( lambda x: "Parent" if has_child(x, df["WBS #"].tolist()) else "Child" )
3. 验证结果
运行代码后打印DataFrame,就能得到和你示例完全一致的结果:
print(df)
输出结果:
WBS # Parent/Child 0 1 Parent 1 1.1 Parent 2 1.1.1 Child 3 1.1.2 Parent 4 1.1.2.1 Parent 5 1.1.2.1.1 Parent 6 1.1.2.1.1.1 Child 7 1.1.2.1.1.2 Child 8 1.1.2.1.2 Child 9 1.1.2.1.3 Child 10 1.1.2.2 Child
优化建议(针对大数据量)
如果你的DataFrame行数很多,上面的循环方法效率可能不够高。可以用集合优化查找速度,减少重复计算:
all_wbs = df["WBS #"].tolist() df["Parent/Child"] = df["WBS #"].apply( lambda x: "Parent" if any(wbs.startswith(f"{x}.") for wbs in all_wbs) else "Child" )
这样处理后,你就能轻松基于Parent/Child列筛选出所有子级元素进行后续汇总操作啦~
内容的提问来源于stack exchange,提问作者Ryan Kapper
相关产品推荐
相关产品推荐

