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

基于deptid列构建层级结构:Pandas实现问题求助

按部门构建员工层级结构的实现方案

问题背景

原始DataFrame:

empidmgriddeptid
121
231
561
232
342

期望输出:

deptidempidhierarchy
11[2,3]
12[3]
15[6]
22[3,4]
234

核心需求是按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 20:40:47