如何对DataFrame中Hierarchy层级及其子层级分组求和?
多级层级分组求和并保留维度的实现方法
问题场景
- 现有DataFrame包含
Hierarchy、Cost、Type、Region四列 - 需要按
Hierarchy的所有层级(从最顶层到最底层的每个子路径)分组,对Cost求和,同时保留Type、Region维度 - 特殊情况:如果父层级没有某类
Type的直接记录,但子层级存在,父层级的该Type对应Cost要等于所有子层级的总和 - 原尝试代码
df.groupby(grp_df['Hierarchy'].str.split('/').str[0], sort=False).sum().reset_index()只能得到父层级的总Cost,无法按Type、Region拆分
解决思路与代码实现
核心是先把每个完整层级路径拆分成所有父层级+自身的子路径,再按「层级+Type+Region」组合求和。
- 导入依赖并准备示例数据
import pandas as pd # 示例原始数据 df = pd.DataFrame({ 'Hierarchy': ['A/B/C', 'A/B/D', 'B/C', 'B/D/E'], 'Cost': [10, 20, 15, 5], 'Type': ['K', 'K', 'M', 'K'], 'Region': ['North', 'North', 'South', 'East'] })
- 拆分层级路径为所有子路径
# 把每个Hierarchy拆分成从顶层到当前层的所有路径 df['all_hierarchies'] = df['Hierarchy'].apply( lambda x: ['/'.join(x.split('/')[:i+1]) for i in range(len(x.split('/')))] ) # 将列表拆分为多行,每个层级对应一行记录 expanded_df = df.explode('all_hierarchies').rename(columns={'all_hierarchies': 'Hierarchy_Level'})
- 按层级+Type+Region分组求和
# 分组求和,保留原始顺序 result = expanded_df.groupby(['Hierarchy_Level', 'Type', 'Region'], sort=False)['Cost'].sum().reset_index()
结果说明
执行后会得到每个层级下,对应Type和Region的累计Cost:
- 比如示例中
A层级的Type=K、Region=North的Cost为30(来自A/B/C和A/B/D的Cost之和) - 每个子层级的自身记录也会被保留并正确求和
内容的提问来源于stack exchange,提问作者NexusDreamer
相关产品推荐
相关产品推荐

