Python实现组织数据向上汇总至最高层级的方法咨询
组织层级向上汇总实现方案
问题说明
现有两张表:
- 组织表(org_table):存储公司组织层级关系,层级可能存在空值,但最高(Super Division)和最低层级(Sub Department)永不为空,结构如下:
| Super Division | Division | Super Department | Department | Sub Department |
|---|---|---|---|---|
| 123 | 342 | 767 | 546 | 965 |
| 345 | 453 | 234 | na | 759 |
- 报表表(report_table):报表记录关联任意层级的组织,结构如下:
| Report Name | Org Level | Org ID |
|---|---|---|
| ABC | Division | 342 |
| DEF | Super Department | 234 |
| GHI | Super Division | 123 |
需要生成包含原报表记录、并向上汇总至最高层级的结果集,预期输出如下:
| Report Name | Org Level | Org ID |
|---|---|---|
| ABC | Division | 342 |
| ABC | Super Division | 123 |
| DEF | Super Department | 234 |
| DEF | Division | 453 |
| DEF | Super Division | 345 |
| GHI | Super Division | 123 |
原编写的函数会返回所有较低层级数据,不符合需求,需调整逻辑。
解决方案实现
核心思路
- 明确组织层级从高到低的顺序:
Super Division → Division → Super Department → Department → Sub Department - 对每条报表记录,找到其对应在组织表中的行
- 从当前关联层级开始,向上遍历所有更高层级,收集有效层级的名称和ID
- 将收集到的层级信息与原报表名称组合,生成最终结果
代码实现
import pandas as pd import numpy as np # 构造示例组织表 org_data = [ [123, 342, 767, 546, 965], [345, 453, 234, np.nan, 759] ] org_table = pd.DataFrame( org_data, columns=['Super Division', 'Division', 'Super Department', 'Department', 'Sub Department'] ) # 构造示例报表表 report_data = [ ['ABC', 'Division', 342], ['DEF', 'Super Department', 234], ['GHI', 'Super Division', 123] ] report_table = pd.DataFrame( report_data, columns=['Report Name', 'Org Level', 'Org ID'] ) # 定义组织层级从高到低的顺序 hierarchy_order = ['Super Division', 'Division', 'Super Department', 'Department', 'Sub Department'] def get_upper_hierarchy(report_row): report_name = report_row['Report Name'] current_level = report_row['Org Level'] current_id = report_row['Org ID'] # 获取当前层级在层级顺序中的索引 current_idx = hierarchy_order.index(current_level) # 匹配组织表中对应层级ID的行 org_row = org_table[org_table[current_level] == current_id].iloc[0] rollup_data = [] # 从当前层级向上遍历到最高层级 for idx in range(current_idx, -1, -1): level = hierarchy_order[idx] org_id = org_row[level] if pd.notna(org_id): rollup_data.append({ 'Report Name': report_name, 'Org Level': level, 'Org ID': org_id }) return rollup_data # 生成最终结果 result_list = [] for _, row in report_table.iterrows(): result_list.extend(get_upper_hierarchy(row)) final_result = pd.DataFrame(result_list) print(final_result)
代码说明
- 层级顺序定义:明确从最高到最低的层级关系,确保向上遍历的方向正确
- 匹配组织行:通过报表中的
Org Level和Org ID找到对应的组织记录 - 向上遍历收集:从当前层级索引开始,反向遍历到最高层级(索引0),只保留非空的层级数据,确保结果只包含当前及上级层级
- 结果合并:将每条报表记录生成的层级列表合并,转换为DataFrame得到最终输出
内容的提问来源于stack exchange,提问作者Sunny Shen
相关产品推荐
相关产品推荐

