嵌套字典多叶子节点处理代码问题求助
修正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])
修正说明
- 节点自身数据初始化:先通过
HIERARCHYNODEID筛选当前节点的所有行,计算自身HVALUE总和并收集IDs,确保叶子节点能正确携带自身数据 - 子节点分组处理:使用
groupby按子节点ID分组,避免重复处理同一子节点的多行数据 - 正确的累加逻辑:父节点仅累加子节点的最终
HVALUE和IDs(包含子节点自身及下层节点的数据),不再直接使用子节点行的原始数据 - 通用性适配:支持同一节点多行数据、多层嵌套、多叶子节点的场景,无需针对特定结构修改
验证结果
修正后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
相关产品推荐
相关产品推荐

