基于deptid列构建层级结构:Pandas实现问题求助
按部门构建员工层级结构的实现方案
问题背景
原始DataFrame:
| empid | mgrid | deptid |
|---|---|---|
| 1 | 2 | 1 |
| 2 | 3 | 1 |
| 5 | 6 | 1 |
| 2 | 3 | 2 |
| 3 | 4 | 2 |
期望输出:
| deptid | empid | hierarchy |
|---|---|---|
| 1 | 1 | [2,3] |
| 1 | 2 | [3] |
| 1 | 5 | [6] |
| 2 | 2 | [3,4] |
| 2 | 3 | 4 |
核心需求是按deptid分组,为每个员工构建专属的上级层级链,现有代码未实现分组逻辑,全局遍历导致结果不符合预期。
现有问题代码
原层级遍历函数(未做分组处理)
import pandas as pd def walk(df, id, f, r, prev=pd.Series(dtype="int64")): mgr = df.loc[df[f]==id,][r] if not mgr.isna().all(): prev = walk(df, mgr.tolist()[0], f, r, prev) return pd.concat([mgr, prev])
尝试的分组代码(存在逻辑问题)
df_pandas = df_pandas[["deptid","empid","mgrid"]] df_pandas1 = (df_pandas.groupby("deptid")) df_pandas1.assign(parent_lineage=lambda x: x["empid"].apply(lambda e: (walk(x, e, "empid", "mgrid") .dropna().astype("string").tolist()))
问题在于:分组后传入walk的是分组对象而非单组DataFrame,且层级拼接逻辑未适配分组场景,同时未处理单个层级值的格式要求。
正确实现方案
步骤1:重构层级遍历函数
针对单个部门的DataFrame,实现层级遍历,并处理单个值的格式输出:
def get_hierarchy(group_df, emp_id): hierarchy = [] # 获取当前员工的直接上级 current_mgr = group_df.loc[group_df['empid'] == emp_id, 'mgrid'].iloc[0] # 循环遍历上级,直到上级不在当前部门的员工列表中 while current_mgr in group_df['empid'].values: hierarchy.append(current_mgr) current_mgr = group_df.loc[group_df['empid'] == current_mgr, 'mgrid'].iloc[0] # 添加最顶层的上级(不属于当前部门员工的节点) hierarchy.append(current_mgr) # 单个层级值直接返回,多个值返回列表 return hierarchy if len(hierarchy) > 1 else hierarchy[0]
步骤2:分组应用函数并整理结果
通过分组操作确保每个部门独立处理层级,最终输出目标格式:
import pandas as pd # 构造原始数据 data = { 'empid': [1,2,5,2,3], 'mgrid': [2,3,6,3,4], 'deptid': [1,1,1,2,2] } df = pd.DataFrame(data) # 按部门分组处理层级 result = df.groupby('deptid').apply( lambda group: group.assign( hierarchy=group['empid'].apply(lambda e: get_hierarchy(group, e)) ) ).reset_index(drop=True) # 调整列顺序匹配期望输出 result = result[['deptid', 'empid', 'hierarchy']] print(result)
最终输出
deptid empid hierarchy 0 1 1 [2, 3] 1 1 2 [3] 2 1 5 [6] 3 2 2 [3, 4] 4 2 3 4
代码说明
get_hierarchy:针对单个部门的员工数据,从指定员工的上级开始递归遍历,直到上级不在当前部门员工列表中,同时处理单个层级值的格式(直接返回值而非列表)。- 分组应用:通过
groupby('deptid').apply确保每个部门独立计算层级,彻底解决全局遍历的问题。 - 结果整理:重置索引并调整列顺序,完全匹配期望输出的结构。
内容的提问来源于stack exchange,提问作者sys
相关产品推荐
相关产品推荐

