使用Pandas按办公点聚合统计查找最高与最低绩效员工
实现方案
思路说明
- 先把原始数据里的T/F布尔值统一转成1/0的数值,方便后续计算均值
- 按「办公点+员工号」分组,计算每个员工在对应办公点的所有绩效指标均值
- 计算绩效总分:正向绩效总分 = 所有含Excellent字段的和,负向绩效总分 = 所有含Bad字段的和,每个办公点里正向总分最高的就是最高绩效员工,负向总分最高的就是最低绩效员工
- 按办公点筛选出对应的员工明细即可
可运行代码
import pandas as pd # 1. 读取原始数据,若从csv读取直接替换为 pd.read_csv("你的文件路径") data = [ [100, 34500, 'T', 'F', 'T', 'F'], [100, 29991, 'F', 'T', 'T', 'F'], [100, 10503, 'T', 'F', 'F', 'T'], [101, 32451, 'T', 'F', 'F', 'T'], [101, 55566, 'F', 'T', 'T', 'F'], [101, 55566, 'F', 'T', 'F', 'T'], [101, 64331, 'T', 'F', 'T', 'F'], [105, 22661, 'F', 'T', 'T', 'F'], [105, 23552, 'F', 'T', 'F', 'T'], [105, 22661, 'T', 'F', 'T', 'F'], [105, 69392, 'F', 'T', 'T', 'F'], [105, 23552, 'F', 'T', 'F', 'T'], ] df = pd.DataFrame(data, columns=['OfficeNum', 'EmployeeNum', 'ExcellentWriting', 'BadWriting', 'ExcellentEvidence', 'BadEvidence']) # 2. T/F转换为1/0数值 df = df.replace({'T': 1, 'F': 0}) # 3. 按办公点+员工号聚合计算各指标均值 employee_agg = df.groupby(['OfficeNum', 'EmployeeNum'], as_index=False).mean() # 4. 分别计算正向、负向绩效总分 excellent_cols = [col for col in df.columns if 'Excellent' in col] bad_cols = [col for col in df.columns if 'Bad' in col] employee_agg['excellent_score'] = employee_agg[excellent_cols].sum(axis=1) employee_agg['bad_score'] = employee_agg[bad_cols].sum(axis=1) # 5. 按办公点筛选最高/最低绩效员工 # 最高绩效:正向得分最高 top_employee = employee_agg.loc[employee_agg.groupby('OfficeNum')['excellent_score'].idxmax()].reset_index(drop=True) # 最低绩效:负向得分最高 bottom_employee = employee_agg.loc[employee_agg.groupby('OfficeNum')['bad_score'].idxmax()].reset_index(drop=True) # 输出结果时可删除临时计算的分数字段 top_result = top_employee.drop(columns=['excellent_score', 'bad_score']) bottom_result = bottom_employee.drop(columns=['excellent_score', 'bad_score']) print("最高绩效员工明细:") print(top_result) print("\n最低绩效员工明细:") print(bottom_result)
结果说明
运行后输出的最高绩效员工和你给出的预期结果完全一致,最低绩效员工会输出每个办公点负向指标总和最高的员工明细。
内容的提问来源于stack exchange,提问作者billv1179
相关产品推荐
相关产品推荐

