[英]Pandas Assign Same Number of Random Values
我有一個需要隨機分配給工作人員的任務數據框。 每個任務應接受一名隨機工人,並且每個工人應具有與其他工人相同數量的任務。
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))
? 如果工作人員的任務數量不相等-隨機分配最后一個任務
使用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
這應該工作:
df['assign'] = np.random.choice([1, 2, 3]*3, size=9, replace=False)
創建一個包含每個工作人員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
。 這應該可以解決問題!
workers = 9
df['a'] = np.random.permutation(np.repeat([1,2,3], math.ceil(workers/3)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.