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 :
L'erreur retournée est :Code:
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))
Que s'est-il passé ?Code:
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
Merci.