Python中基于Manager_ID创建Employee_Count计数列的问题
问题描述
我正在处理包含Employee_ID和Manager_ID的数据集,希望添加Employee_Count列,该列值为对应Manager_ID管理的员工总数。
输入数据集:
Employee_ID Manager_ID 1 5 2 5 3 5 4 7 5 7 6 7 7 14 8 9 9 7 10 9 11 12
期望输出:
Employee_ID Manager_ID Employee_Count 1 5 3 2 5 3 3 5 3 4 7 4 5 7 4 6 7 4 7 14 1 8 9 2 9 7 4 10 9 2 11 12 1
当前使用的代码:
count = 0 reports = [] for i, column in df.iterrows(): if column['Employee_ID'] == column['Manager_ID']: count += 1 reports.append(count) else: reports.append(0) df['Employee_Count'] = reports
运行后结果全为0,推测是逐行判断逻辑错误,寻求正确实现方法。
*已更新表格为更准确样式,对此变更深表歉意。
解决方案
你的代码逻辑错误在于,你判断的是当前行的员工ID和经理ID是否相等,这和统计经理管理的员工总数完全无关——你的数据里没有员工自己当自己经理的情况,所以结果全为0。
正确思路是:先统计每个Manager_ID在Manager_ID列中出现的次数(该次数就是对应经理管理的员工数),再将这个次数匹配回原表的每一行。
方法一:value_counts + map(最简洁高效)
# 统计每个Manager_ID对应的员工数量 manager_counts = df['Manager_ID'].value_counts() # 将统计结果映射到原表,生成目标列 df['Employee_Count'] = df['Manager_ID'].map(manager_counts)
方法二:groupby + transform(扩展性更强)
如果后续需要基于分组做更多计算,这种方法更灵活:
# 按Manager_ID分组,统计每组行数,再将结果广播到原表所有行 df['Employee_Count'] = df.groupby('Manager_ID')['Manager_ID'].transform('count')
这两种方法都能得到预期结果,且比iterrows循环效率高很多(Pandas内置操作的性能远优于逐行循环)。
内容的提问来源于stack exchange,提问作者That_non_coder
相关产品推荐
相关产品推荐

