2017-11-04 148 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