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

Python中递归结构DataFrame同路径数量乘积求和实现咨询

BOM递归结构路径乘积求和高效实现方案

针对你需要的层级递归Qty乘积求和需求,优先推荐拓扑排序+动态规划的实现方案,时间复杂度为O(节点数+边数),非常适合大规模数据集使用,具体实现如下:

import pandas as pd
import networkx as nx

# 示例数据
data = pd.DataFrame({'ParentCode': ['A', 'B', 'Z', 'Y'],
                     'ItemCode': ['B', 'C', 'Y', 'C'],
                     'Qty': [2, 1, 3, 4]})

# 构建有向无环图
g = nx.from_pandas_edgelist(data, 'ParentCode', 'ItemCode', 
                            edge_attr='Qty', create_using=nx.DiGraph())

# 拓扑排序,保证处理节点时所有上游父节点已处理完成
topo_order = list(nx.topological_sort(g))

# 初始化累计用量字典
total_qty = {node: 0 for node in g.nodes}
# 根节点(无上游父节点)累计用量初始为1
for node in topo_order:
    if g.in_degree(node) == 0:
        total_qty[node] = 1

# 遍历计算每个节点的总累计用量
for node in topo_order:
    for successor in g.successors(node):
        edge_qty = g.get_edge_data(node, successor)['Qty']
        total_qty[successor] += total_qty[node] * edge_qty

# 筛选叶子节点(无下游子节点)的结果,转成DataFrame
leaf_nodes = [node for node in g.nodes if g.out_degree(node) == 0]
result = pd.DataFrame({'ItemCode': leaf_nodes, 'TotalQty': [total_qty[n] for n in leaf_nodes]})

上述代码运行后得到的结果中,子项C对应的TotalQty为14,完全符合需求。
如果你不想引入networkx依赖,也可以用纯Pandas迭代实现:

import pandas as pd

data = pd.DataFrame({'ParentCode': ['A', 'B', 'Z', 'Y'],
                     'ItemCode': ['B', 'C', 'Y', 'C'],
                     'Qty': [2, 1, 3, 4]})

# 初始化:根节点的累计用量为1
current = pd.DataFrame({'Code': data[~data['ParentCode'].isin(data['ItemCode'])]['ParentCode'].unique(), 'CumQty': 1})
result = []

while not current.empty:
    # 关联下一层级
    merged = current.merge(data, left_on='Code', right_on='ParentCode', how='inner')
    if merged.empty:
        # 没有下一层的是叶子节点,存入结果
        result.extend(current.to_dict('records'))
        break
    # 计算下一层的累计用量
    merged['CumQty'] = merged['CumQty'] * merged['Qty']
    # 汇总相同节点的累计用量,减少后续计算量
    current = merged[['ItemCode', 'CumQty']].rename(columns={'ItemCode': 'Code'}).groupby('Code', as_index=False).sum()

# 转成DataFrame
result_df = pd.DataFrame(result).rename(columns={'Code': 'ItemCode', 'CumQty': 'TotalQty'})

注意:使用前需保证你的层级结构是无循环依赖的DAG结构,避免出现死循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:36:03