基于双DataFrame构建带金额汇总的树形结构(Back=1场景)
构建层级树形结构并汇总金额(基于Back=1的数据集)
核心逻辑实现
针对你需要以8582为根节点,构建包含子层级并汇总金额的需求,以下是可直接运行的Python方案,解决递归层级构建和金额汇总的问题:
步骤1:准备数据与依赖
先导入必要库,同时模拟符合你逻辑的数据集(替换为你的实际数据集即可):
import pandas as pd import json # 替换为你的实际数据集 data = { 'Code': [8582, 8584, 8593, 8585, 8586, 8587, 8588, 8594], 'ParentCode': [None, 8582, 8582, 8582, 8582, 8584, 8584, 8593], 'Amount': [100, 50, 30, 40, 20, 15, 10, 5], 'Back': [1, 1, 1, 1, 1, 1, 1, 1] } df2 = pd.DataFrame(data)
步骤2:过滤数据并构建节点映射
只处理Back=1的记录,同时构建父节点到子节点的快速映射,提升递归效率:
# 过滤符合条件的记录 filtered_df = df2[df2['Back'] == 1].copy() # 构建父节点→子节点的映射字典 parent_child_map = filtered_df.groupby('ParentCode').apply(lambda x: x.to_dict('records')).to_dict()
步骤3:递归构建树形结构并汇总金额
通过递归函数遍历节点,同时计算每个节点的自身金额和总金额(自身+所有子节点金额):
def build_tree(node_code): # 获取当前节点的基础数据 node_row = filtered_df[filtered_df['Code'] == node_code].iloc[0] node_info = node_row.to_dict() # 初始化子节点列表和总金额 children = [] total_amount = node_info['Amount'] # 递归处理子节点 if node_code in parent_child_map: for child_node in parent_child_map[node_code]: child_tree = build_tree(child_node['Code']) children.append(child_tree) total_amount += child_tree['total_amount'] # 返回结构化节点数据 return { 'code': node_code, 'self_amount': node_info['Amount'], 'total_amount': total_amount, 'children': children } # 生成以8582为根的树形结构 root_tree = build_tree(8582)
步骤4:输出JSON格式结果
将树形结构转为格式化JSON,方便后续可视化:
# 输出格式化JSON print(json.dumps(root_tree, indent=4))
输出示例
运行后会得到如下结构的JSON,包含完整层级和金额汇总:
{ "code": 8582, "self_amount": 100, "total_amount": 270, "children": [ { "code": 8584, "self_amount": 50, "total_amount": 75, "children": [ { "code": 8587, "self_amount": 15, "total_amount": 15, "children": [] }, { "code": 8588, "self_amount": 10, "total_amount": 10, "children": [] } ] }, { "code": 8593, "self_amount": 30, "total_amount": 35, "children": [ { "code": 8594, "self_amount": 5, "total_amount": 5, "children": [] } ] }, { "code": 8585, "self_amount": 40, "total_amount": 40, "children": [] }, { "code": 8586, "self_amount": 20, "total_amount": 20, "children": [] } ] }
常见问题排查
如果你的原有代码未达预期,大概率是以下原因:
- 未正确过滤
Back=1的记录,混入了无关节点 - 递归逻辑缺失,导致子层级未被正确遍历
- 金额汇总未累加子节点的总金额,只统计了自身金额
- 父节点映射构建错误,导致无法找到子节点
内容的提问来源于stack exchange,提问作者Gogo78
相关产品推荐
相关产品推荐

