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

嵌套字典多叶子节点处理代码问题求助

修正Python Pandas构建层级嵌套字典的叶子节点数据错误

问题分析

原代码存在两个核心问题:

  • 叶子节点未正确初始化自身的HVALUE和IDs,直接使用默认的0和空列表,导致自身数据丢失
  • 父节点累加逻辑混淆了子节点自身数据和子节点的下层节点数据,错误地将子节点的自身数据直接加到父节点,而非先赋值给子节点

修正后的代码

import pandas as pd

data = [
    [8567, None, None, None],
    [8596, 8595, None, 5033],
    [8576, 8571, None, 447],
    [8576, 8571, -1879674.00, 152],
    [8576, 8571, 2971934.78, 152],
    [8576, 8571, -21044.15, 150],
    [8577, 8571, None, 5047],
    [8574, 8569, 7807810.50, 329688],
    [8575, 8569, None, 3734],
    [8573, 8568, None, 414397],
    [8572, 8568, 12234723.90, 336487],
    [8571, 8567, None, None],
    [8569, 8567, None, None],
    [8568, 8567, None, None],
    [8595, 8567, None, None]]

df = pd.DataFrame(data, columns=["HIERARCHYNODEID", "PARENTNODEID", "HVALUE", "IDs"])
df = df.fillna(0)

def build_dict(df):
    hierarchy_dict = {}
    root_nodes = df[df['PARENTNODEID'] == 0]
    for _, r in root_nodes.iterrows():
        hierarchy_dict[r['HIERARCHYNODEID']] = build_dict_helper(df, r['HIERARCHYNODEID'])
    return hierarchy_dict

def build_dict_helper(df, node_id):
    # 1. 获取当前节点的所有自身数据(同一node_id可能有多行)
    self_rows = df[df['HIERARCHYNODEID'] == node_id]
    # 初始化自身的HVALUE和IDs
    node = {
        "HVALUE": self_rows["HVALUE"].sum(),
        "IDs": self_rows["IDs"].tolist()
    }
    child_nodes = {}
    
    # 2. 获取当前节点的所有子节点(按子节点ID分组,避免重复处理)
    children = df[df['PARENTNODEID'] == node_id].groupby("HIERARCHYNODEID")
    
    for child_id, _ in children:
        child_node = build_dict_helper(df, child_id)
        # 3. 将子节点的HVALUE和IDs累加到当前节点
        node["HVALUE"] += child_node["HVALUE"]
        node["IDs"].extend(child_node["IDs"])
        # 4. 将子节点加入当前节点的子节点字典
        child_nodes[child_id] = child_node
    
    if child_nodes:
        node.update(child_nodes)
    return node

def create_named_dict(df):
    return build_dict(df)

result = create_named_dict(df)
# 打印8568节点验证
print(result[8567][8568])

修正说明

  1. 节点自身数据初始化:先通过HIERARCHYNODEID筛选当前节点的所有行,计算自身HVALUE总和并收集IDs,确保叶子节点能正确携带自身数据
  2. 子节点分组处理:使用groupby按子节点ID分组,避免重复处理同一子节点的多行数据
  3. 正确的累加逻辑:父节点仅累加子节点的最终HVALUE和IDs(包含子节点自身及下层节点的数据),不再直接使用子节点行的原始数据
  4. 通用性适配:支持同一节点多行数据、多层嵌套、多叶子节点的场景,无需针对特定结构修改

验证结果

修正后8568节点的输出与预期一致:

{'HVALUE': 12234723.9, 'IDs': [414397.0, 336487.0], 8573: {'HVALUE': 0.0, 'IDs': [414397.0]}, 8572: {'HVALUE': 12234723.9, 'IDs': [336487.0]}}

内容的提问来源于stack exchange,提问作者vixinfgg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:55:58