我有一个需要随机分配给工作人员的任务数据框。每个任务应接受一名随机工人,并且每个工人应具有与其他工人相同数量的任务。
import pandas as pd
import numpy as np
tasks = ['Task 1','Task 2','Task 3','Task 4','Task 5','Task 6','Task 7','Task 8','Task 9']
df = pd.DataFrame({'Tasks':tasks})
Tasks
0 Task 1
1 Task 2
2 Task 3
3 Task 4
4 Task 5
5 Task 6
6 Task 7
7 Task 8
8 Task 9
我想要给每个任务分配1-3之间的随机数。但是每个数字应该出现3次。如此预期的结果:
Tasks Assign
0 Task 1 1
1 Task 2 2
2 Task 3 2
3 Task 4 3
4 Task 5 3
5 Task 6 1
6 Task 7 2
7 Task 8 3
8 Task 9 1
我已经考虑过使用numpy,但是找不到适合我要求的函数。像np.random.randint(1,4, size=(1,9))
之类的东西?如果工作人员的任务数量不相等-随机分配最后一个任务
答案 0 :(得分:2)
使用shuffle
a=np.array([1,2,3]*3)
np.random.shuffle(a)
a
Out[230]: array([1, 3, 3, 2, 1, 2, 3, 1, 2])
df['New']=a
df
Out[232]:
Tasks New
0 Task 1 1
1 Task 2 3
2 Task 3 3
3 Task 4 2
4 Task 5 1
5 Task 6 2
6 Task 7 3
7 Task 8 1
8 Task 9 2
答案 1 :(得分:1)
这应该有效:
df['assign'] = np.random.choice([1, 2, 3]*3, size=9, replace=False)
答案 2 :(得分:1)
创建一个包含每个工作人员ID所需次数的列表:[1、1、1、2、2、2、3、3、3]。现在shuffle
列表(以随机顺序生成)。将它们分配给任务。
足以引导您找到解决方案吗?
对每个OP评论的回复
让我们t
作为任务的数量,w
作为工作者的数量。您担心t / w
不是整数的情况。这是一个非常有效的担心。让我们考虑t=10, w=3
。第一个虽然t是简单地四舍五入并列出12个工作人员ID的列表,然后随机排列并分配前10个ID。但是,这可以给我们一个列表,例如
[1, 2, 3, 3, 3, 2, 3, 1, 2, 2, 1, 1]
当我们分配前10个ID时,工作程序1只有2个任务。我们希望平衡负载,以使两个工作人员之间的差异不会超过一项任务。
要解决此问题,我们需要两个列表:
body = np.array([1,2,3]*3)
tail = np.array([1,2,3])
np.random.shuffle(tail)
从这里...
tail
附加到body
;截断为任务数量。这为您提供了每个工作人员的t // w
ID的列表,并为该工作人员的一个子集提供了另外一个个ID。body
。答案 3 :(得分:0)
这应该可以解决问题!
workers = 9
df['a'] = np.random.permutation(np.repeat([1,2,3], math.ceil(workers/3)))