如何递归查找子类并同时聚合其对应数值?
解决方案
步骤1:整理基础数据
先收集所有出现过的类(包括class列和非空的sub_class列),同时构建父类到直接子类的映射、类到实体值的映射:
import pandas as pd df = pd.DataFrame({'class': ['class_b', 'class_a', 'class_c', 'class_d'], 'sub_class': ['class_d', None, 'class_e', 'class_a'], 'entities': [5, 1, 7, 6]}) # 收集所有存在的类 all_classes = pd.concat([df['class'], df['sub_class'].dropna()]).unique() # 父类→直接子类的映射 parent_child_map = df.dropna(subset=['sub_class']).set_index('class')['sub_class'].to_dict() # 类→实体值的映射,不存在的类默认0 entities_dict = df.set_index('class')['entities'].to_dict()
步骤2:遍历获取所有子类
编写函数循环遍历每个类的子类链,收集所有后代子类:
def get_all_subclasses(cls): subclasses = [] current_sub = parent_child_map.get(cls) # 循环遍历直到没有下一级子类 while current_sub is not None: subclasses.append(current_sub) current_sub = parent_child_map.get(current_sub) return subclasses
步骤3:计算总和并生成结果
遍历所有类,计算每个类的实体总和(自身+所有子类),最后整理成目标DataFrame:
result_list = [] for cls in all_classes: sub_list = get_all_subclasses(cls) # 计算自身实体值 + 所有子类实体值之和 total = entities_dict.get(cls, 0) + sum(entities_dict.get(sub, 0) for sub in sub_list) result_list.append({ 'class': cls, 'all_subclass': sub_list, 'sum_entites': total }) # 整理成DataFrame并按类名排序,匹配期望输出 result_df = pd.DataFrame(result_list).sort_values('class').reset_index(drop=True) print(result_df)
运行后输出:
class all_subclass sum_entites 0 class_a [] 1 1 class_b [class_d, class_a] 12 2 class_c [class_e] 7 3 class_d [class_a] 7 4 class_e [] 0
思路说明
- 补全所有类节点,避免遗漏仅在
sub_class中出现的类(如class_e) - 用字典映射替代多次DataFrame合并,提升查找效率
- 通过循环遍历子类链,实现类似
os.walk的层级查找,适配最多5层的场景 - 实体总和计算直接基于字典查询,避免重复操作
内容的提问来源于stack exchange,提问作者VERBOSE
相关产品推荐
相关产品推荐

