熊猫分配相同数量的随机值

时间:2018-08-15 16:28:36

标签: python pandas numpy dataframe

我有一个需要随机分配给工作人员的任务数据框。每个任务应接受一名随机工人,并且每个工人应具有与其他工人相同数量的任务。

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))之类的东西?如果工作人员的任务数量不相等-随机分配最后一个任务

4 个答案:

答案 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)))