Python如何从列表为DataFrame分配不同值生成合规员工排班表
Python员工排班表实现方案
原有代码问题
原代码中np.random.choice(shift)没有指定采样个数,只会从班次列表里返回1个随机值,传给DataFrame后会把这个单值填充到所有单元格,自然没法生成符合规则的随机排班;另外days列表里sunday前面多打了个空格,后续调用容易出现匹配错误。
排班规则落地逻辑
两个核心规则可以拆成两步实现,从硬约束到软随机依次处理,避免随机生成后反复校验的性能浪费:
- 先处理休息日约束:给每个员工在周一到周五范围内随机选1天设为休息日,直接保证「每人每周仅1天休息、休息日不在周六周日」的要求
- 再处理当班班次约束:逐天给当天需要上班的员工随机分配早/晚班,控制单个班次人数不超过2,周六周日全员排早/晚班,不安排休息
可直接运行的代码
import random import pandas as pd # 基础配置 shift_work = ['am', 'pm'] names = ['ola', 'ade', 'bisi'] days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'] weekday_range = days[:5] # 允许安排休息的周一到周五区间 # 初始化空排班表 schedule_df = pd.DataFrame(index=names, columns=days) # 第一步:为所有员工分配休息日 for emp in names: rest_day = random.choice(weekday_range) schedule_df.loc[emp, rest_day] = 'off' # 第二步:逐天分配当班班次 for day in days: # 筛选当天需要到岗的员工 on_duty = [emp for emp in names if pd.isna(schedule_df.loc[emp, day])] random.shuffle(on_duty) # 打乱员工顺序保证排班随机性 # 随机确定早班人数,范围控制在1~2,同时保证晚班至少有1人到岗 am_headcount = random.randint(1, min(2, len(on_duty)-1)) # 拆分早、晚班人员名单 am_staff = on_duty[:am_headcount] pm_staff = on_duty[am_headcount:] # 写入排班结果 for emp in am_staff: schedule_df.loc[emp, day] = 'am' for emp in pm_staff: schedule_df.loc[emp, day] = 'pm' # 打印输出最终排班表 print(schedule_df)
效果说明
- 每次运行都会生成不同的随机排班结果
- 所有员工的休息日都落在周一到周五,每人恰好1天休息
- 任意一天的早班、晚班人数都不会超过2人
- 周六周日不安排休息,自动拆分出2人一个班、1人一个班的组合,符合单班次人数上限要求
内容的提问来源于stack exchange,提问作者Bello Nasiff
相关产品推荐
相关产品推荐

