1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
import pandas as pd
import numpy as np
from numpy import random
nb_choix=2
nb_groupes=5
personnes_by_groupe=4
liste = []
# Création du dataframe d'exemple
data = pd.DataFrame({
"nom" : ["personne1", "personne2", "personne3", "personne4", "personne5", "personne6", "personne7", "personne8", "personne9", "personne10", "personne11", "personne12", "personne13", "personne14", "personne15", "personne16", "personne17", "personne18", "personne19", "personne20"],
"choix1" : [4, 5, 4, 2, 1, 1, 2, 4, 2, 1, 1, 3, 2, 4, 4, 1, 4, 2, 2, 5],
"choix2" : [2, 2, 2, 1, 3, 2, 1, 2, 3, 5, 5, 1, 3, 2, 2, 2, 1, 4, 4, 4]})
#Transformation du dataframe, pour l'adapter à votre tuple généré
a_concat = data.iloc[:,1:]
data["join"] = a_concat.values.tolist()
data = data[["nom", "join"]]
data["grou"] = None
for i in range(len(data)):
data["join"][i] = tuple(data["join"][i])
test = [tuple(x) for x in data.values]
for i in range(len(test)):
test[i] = list(test[i])
personnes = tuple(test)
# Initialisation des groupes
groupe=[[] for i in range(nb_groupes)]
# Traitement des personnes triées selon leurs choix
for p in sorted(
personnes,
key=lambda x: x[1],
reverse=True,
):
# Traitement des choix
for c in p[1]:
# Vérification place dans groupe
if len(groupe[c-1]) < personnes_by_groupe:
# La personne va dans le groupe
groupe[c-1].append(p)
# Le n° de groupe est enregistré dans la personne (ça ne mange pas de pain)
p[2]=c
# Arrêt de la recherche
break
# if
else:
# Pas de groupe dispo selon un des choix
for (i, g) in enumerate(groupe):
print("groupe %d (%d): %s" % (i+1, len(g), g))
raise IOError(
"Plus de place disponible pour %s selon ses choix %s" % (
p[0],
", ".join(map(str, p[1])),
)
)
# for
# for
for (i, g) in enumerate(groupe):
print("groupe %d (%d): %s" % (i+1, len(g), g))
data=dict(
(
("prenom", tuple(x[0] for x in personnes)),
) + tuple(
("choix%d" % (i+1), tuple(x[1][i] for x in personnes)) for i in range(nb_choix)
)
)
frame=pd.DataFrame(data)
print(frame) |
Partager