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
相关产品推荐
相关产品推荐

