2017-11-04 2 views
0

Ich muss Benutzer zufällig zu Gruppen zuweisen. Die Tabelle des Prozess bestimmt, ist wie folgt:Bedingte zufällige Zuordnung in Python

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

Gemäß der obigen Matrix, gibt es insgesamt 11 Benutzer aus dem Bereich 0, 16 aus dem Bereich 1 und 3 aus dem Bereich 2.

Weiterhin von die 11 Benutzer aus Bereich 0, 9 sollten der Gruppe A zugeordnet werden, 1 sollte jeweils B und C zugeordnet werden. Der Prozess ist analog für die übrigen Gruppen.

Ich habe einige Code in 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]) 

Die letzte Zeile erzeugt einen Zufallsvektor von ganzen Zahlen z.B. [1, 4, 10, 2, 5, 11, 9, 3, 8, 7, 6]. Ich kann Indizes von 1 bis 9 zu Gruppe A, den Index mit 10 zu Gruppe B, den Index mit 11 zu Gruppe C zuweisen. Mit anderen Worten, Benutzer 3 geht zu Gruppe B, Benutzer 6 geht zu Gruppe C und alle geht Rest der Gruppe A.

Der gewünschte Ausgang [A,A,B,A,A,C,A,A,A,A,A] wäre, oder noch besser, ein Pandas Datenrahmen wie:

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

Wie kann ich automatisiere den Prozess, den ich oben in Worten beschrieben? (Die tatsächliche Zuteilung Matrix 10 x 10)

Antwort

1

Sie np.repeat verwenden könnten einen Array mit der richtigen Anzahl von Benutzern zu erhalten:

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')] 

Und dann sie permutieren:

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)] 

und dann Sie könnten pd.Series für jedes Array aufrufen, wenn Sie möchten.

+0

Danke! Das wurde sehr gut erklärt. – wwl