2017-11-04 145 views
0

我需要有條件地隨機分配用戶到組。管理過程中的表如下:Python中的條件隨機分配

A B C 
0 9 1 1 
1 1 7 8 
2 0 2 1 

根據上述矩陣,有從區域1總共面積0,16 11個的用戶的,和3從區域2

此外,來自區域0,9的11個用戶應分配給組A,每個應分配給B和C.該過程與其餘組相似。

我有一些代碼在Python:

import random 
import pandas as pd 
df = pd.DataFrame({"A": [9,1,0], "B": [1,7,2], "C": [1,8,1]}) 
random.sample(range(1,df.sum(axis=1)[0] + 1),df.sum(axis=1)[0]) 

最後一行創建整數的隨機矢量例如[1, 4, 10, 2, 5, 11, 9, 3, 8, 7, 6]。我可以將索引從1到9分配給A組, 索引有10到B組,即11到C組的索引。換句話說,用戶3進入組B,用戶6進入組C,所有休息去A組

所需的輸出是[A,A,B,A,A,C,A,A,A,A,A],甚至更好,一個大熊貓數據幀,如:

1 A 
2 A 
3 B 
4 A 
5 A 
6 C 
... 

我如何可以自動在我上面的話描述的過程? (實際分配矩陣是10×10)

回答

1

你可以使用np.repeat要獲得正確的用戶數的數組:

In [38]: [np.repeat(df.columns, row) for row in df.values] 
Out[38]: 
[Index(['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'C'], dtype='object'), 
Index(['A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 
     'C', 'C'], 
     dtype='object'), 
Index(['B', 'B', 'C'], dtype='object')] 

然後置換他們:

In [39]: [np.random.permutation(np.repeat(df.columns, row)) for row in df.values] 
Out[39]: 
[array(['C', 'A', 'A', 'A', 'A', 'A', 'B', 'A', 'A', 'A', 'A'], dtype=object), 
array(['A', 'B', 'C', 'C', 'B', 'C', 'B', 'C', 'C', 'B', 'B', 'C', 'C', 
     'C', 'B', 'B'], dtype=object), 
array(['B', 'C', 'B'], dtype=object)] 

,然後如果你願意,你可以在每個數組上調用pd.Series。

+0

謝謝!這很好解釋。 – wwl