簡體   English   中英

熊貓分配相同數量的隨機值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM