You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何递归查找子类并同时聚合其对应数值?

解决方案

步骤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:08:16