Bonjour,

Je dispose d'un dataframe, qui représente des noms de combinaisons, des personnes qui caractérisent ces combinaisons, et une note moyenne par combinaison. En parcourant le dataframe de haut en bas, je souhaiterais extraire les combinaisons, de telle manière qu'une combinaison ne comporte pas la même personne qu'une autre combinaison. Concrètement, il ne doit pas y avoir une personne dans plusieurs combinaison.

Bien que peu élégant, j'ai réussi à créer cet algorithme. malheureusement, je rencontre une erreur que me fiche tout en l'air seulement lorsque j'applique un filtre sur mon dataframe. Voici un code reproductible qui illustre mon exemple :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
import pandas as pd
import numpy as np
 
#J'initialise mes listes
compo_df = []
group_df = []
 
#Je crée mon dataframe
df = pd.DataFrame({'nom_combinaison': ['Compo1', 'Compo2', 'Compo3', 'Compo4','Compo5', 'Compo6', 'Compo7', 'Compo8'], 'prenom': ["[Personne3, Personne5, Personne6]", "[Personne3, Personne4, Personne11]", "[Personne9, Personne11, Personne12]", "[Personne8, Personne9, Personne12]", "[Personne1, Personne9, Personne12]", "[Personne3, Personne4, Personne8]", "[Personne1, Personne3, Personne4]", "[Personne3, Personne6, Personne10]"] , 'moyenne': np.random.randn(8)})
 
#ICI, LA LIGNE QUI FAIT BUGER MON PROGRAMME. CE DERNIER FONCTIONNE BIEN SI ELLE EST SUPPRIMEE
df = df.loc[(df.moyenne > 0.2)]
 
#Par défaut, j'ajoute à mes listes le premier élément des combinaisons et personnes
compo_df.append(df["nom_combinaison"][0])
group_df.append(df["prenom"][0])
 
a_remplir = []
 
for i in range(0, len(df)): #Je parcours mon dataframe
	if len(set(df["prenom"][i]) & set(a_remplir)) == 0: #Si la liste "a_remplir"  ne contient pas d'élément semblable à df["prenom"][i] : 
		print("combi %s : valeur %s"%(df["nom_combinaison"][i], df["prenom"][i])) #Pour m'aider, j'affiche les éléments
		compo_df.append(df["nom_combinaison"][i]) #J'ajoute à mes liste le nom de la combinaison...
		group_df.append(df["prenom"][i])#.... ainsi que les personnes
		print("Je met")
		for value in df["prenom"][i]: #Et j'ajoute à "a_remplir" les valeurs de la liste de df["prenom"][i] pour éviter d'avoir des groupes avec des personnes similaire entre eux
			a_remplir.append(value)
			print(value)
	else:
		print("combi %s : valeur %s"%(df["nom_combinaison"][i], df["prenom"][i]))
		print("similitude : je rejette")
		print("\n")
 
print(list(set(compo_df)))
print((group_df))
L'erreur retournée est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
combi Combinaison_1 : valeur ['Personne3', 'Personne4', 'Personne11']
Je met
Personne3
Personne4
Personne11
 
Traceback (most recent call last):
  File "delete.py", line 20, in <module>
    if len(set(df["prenom"][i]) & set(a_remplir)) == 0: #Si la liste "a_remplir"  ne contient pas d'élément semblable à df["prenom"][i] : 
  File "C:\ProgramData\Miniconda3\lib\site-packages\pandas\core\series.py", line 871, in __getitem__
    result = self.index.get_value(self, key)
  File "C:\ProgramData\Miniconda3\lib\site-packages\pandas\core\indexes\base.py", line 4405, in get_value
    return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None))
  File "pandas\_libs\index.pyx", line 80, in pandas._libs.index.IndexEngine.get_value
  File "pandas\_libs\index.pyx", line 90, in pandas._libs.index.IndexEngine.get_value
  File "pandas\_libs\index.pyx", line 138, in pandas._libs.index.IndexEngine.get_loc
  File "pandas\_libs\hashtable_class_helper.pxi", line 998, in pandas._libs.hashtable.Int64HashTable.get_item
  File "pandas\_libs\hashtable_class_helper.pxi", line 1005, in pandas._libs.hashtable.Int64HashTable.get_item
KeyError: 1
Que s'est-il passé ?
Merci.