遍历Excel数据集从树形结构中查找无父项的顶层节点
找出数据集中的最高层级节点(无父项的项)
嘿,我来帮你搞定这个问题!首先咱们先把你的数据集整理成清晰的Markdown表格,方便直观查看:
| Item | Material |
|---|---|
| 2094-00003 | MHY00007 |
| 2105-0001 | 2105-0002 |
| 2105-0002 | 2105-1000 |
| 2105-1000 | 2105-1003 |
| 2105-1003 | 7547-122 |
| 7932-00001 | 7932-00015 |
| 7932-00002 | 7932-00015 |
| 7932-00010 | MHY00007 |
| 7932-00015 | 7932-05000 |
| 7932-05000 | MHY00007 |
核心思路
最高层级的节点(无父项的项)的本质是:这个Item从未出现在Material列中。因为如果一个Item是某个其他项的子材料(即出现在Material列),那它必然有父项;反过来,只有当Item不在任何Material值里时,说明没有任何其他项把它当作子节点,它就是顶层节点。
具体实现方法
下面给你两种常用的实现方式,按需选择:
方法1:使用Pandas(适合处理大型数据集)
如果你的数据量比较大,用Pandas会更高效:
import pandas as pd # 构造你的数据集 data = { 'Item': ['2094-00003', '2105-0001', '2105-0002', '2105-1000', '2105-1003', '7932-00001', '7932-00002', '7932-00010', '7932-00015', '7932-05000'], 'Material': ['MHY00007', '2105-0002', '2105-1000', '2105-1003', '7547-122', '7932-00015', '7932-00015', 'MHY00007', '7932-05000', 'MHY00007'] } df = pd.DataFrame(data) # 把所有Material值存入集合(集合的查找速度远快于列表) materials_set = set(df['Material']) # 筛选出不在materials_set中的Item top_level_items = df[~df['Item'].isin(materials_set)]['Item'].tolist() print("最高层级的项:", top_level_items)
运行后输出的结果是:['2094-00003', '2105-0001', '7932-00001', '7932-00002', '7932-00010']
方法2:基础Python实现(无需额外库)
如果不想依赖第三方库,用原生Python就能搞定:
# 原始数据列表,每个元素是(Item, Material)元组 items_data = [ ('2094-00003', 'MHY00007'), ('2105-0001', '2105-0002'), ('2105-0002', '2105-1000'), ('2105-1000', '2105-1003'), ('2105-1003', '7547-122'), ('7932-00001', '7932-00015'), ('7932-00002', '7932-00015'), ('7932-00010', 'MHY00007'), ('7932-00015', '7932-05000'), ('7932-05000', 'MHY00007') ] # 提取所有Material值到集合 materials = {material for item, material in items_data} # 遍历筛选出顶层项 top_level = [item for item, material in items_data if item not in materials] print("最高层级的项:", top_level)
运行结果和上面完全一致。
内容的提问来源于stack exchange,提问作者LarsaSolidor




