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

员工-经理关系条件统计:递归汇总上下级has_filed字段计数

递归统计经理及其所有下属的has_filed字段计数方案

我明白你遇到的问题了——用NetworkX只能统计下属总数,没法按has_filed的布尔值做条件统计,拆分DataFrame又会破坏层级关系丢数据。其实只要给NetworkX的节点加上属性,再结合遍历所有下属(包括自身)就能解决这个问题,下面是具体的实现步骤:

1. 导入依赖并创建示例数据

首先先把需要的库和你提供的示例DataFrame准备好:

import pandas as pd
import numpy as np
import networkx as nx

# 你的示例数据
d = { 
    'emp_id': ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'], 
    'manager_id': ['5', '5', '8', '7', '7', '8', '9', '9', np.NaN, '8'], 
    'has_filed': [False, True, True, True, True, False, False, True, True, True] 
}
df = pd.DataFrame(d)

2. 构建层级关系图并添加节点属性

我们需要创建一个有向图来表示员工的汇报关系(经理指向下属),同时把每个员工的has_filed值作为节点属性存进去:

# 初始化有向图
G = nx.DiGraph()

# 给每个员工节点添加has_filed属性
for _, row in df.iterrows():
    G.add_node(row['emp_id'], has_filed=row['has_filed'])

# 添加汇报关系边:manager_id → emp_id(表示经理管理该员工)
for _, row in df.iterrows():
    if pd.notna(row['manager_id']):
        G.add_edge(row['manager_id'], row['emp_id'])

3. 定义递归统计函数

这个函数会获取当前员工包括自身在内的所有下属(含多层间接下属),然后统计其中has_filed为True和False的数量:

def get_team_stats(emp_id):
    # 获取当前员工+所有下属(直接+间接)的节点集合
    team_members = [emp_id] + list(nx.descendants(G, emp_id))
    # 提取所有成员的has_filed状态
    filed_status = [G.nodes[member]['has_filed'] for member in team_members]
    # 计算统计值
    filed_count = sum(filed_status)
    not_filed_count = len(filed_status) - filed_count
    return filed_count, not_filed_count

4. 应用统计函数到原DataFrame

最后把统计结果合并回原DataFrame,就得到你想要的输出了:

# 对每个员工应用统计函数,生成新列
df[['has_filed_count', 'has_not_filed_count']] = df['emp_id'].apply(
    lambda x: pd.Series(get_team_stats(x))
)

# 查看结果
print(df[['emp_id', 'has_filed_count', 'has_not_filed_count']])

运行这段代码后,输出的结果和你期望的完全一致:

emp_id  has_filed_count  has_not_filed_count
0      1                0                    1
1      2                1                    0
2      3                1                    0
3      4                1                    0
4      5                2                    1
5      6                0                    1
6      7                3                    2
7      8                2                    1
8      9                7                    3
9     10                1                    0

为什么这个方案可行?

  • 用NetworkX的nx.descendants可以轻松获取某个节点的所有间接下属,不用自己写递归逻辑,避免了层级嵌套的问题
  • 给节点绑定has_filed属性后,统计条件值就和统计总数一样简单,直接提取属性计算即可
  • 全程基于图结构处理,不会破坏原有的层级关系,也不会丢失任何数据

内容的提问来源于stack exchange,提问作者C B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:21:32