IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

KeyError: 1 sur une boucle simple ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Par défaut KeyError: 1 sur une boucle simple ?
    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.

  2. #2
    Membre éclairé
    Homme Profil pro
    Data Lover
    Inscrit en
    Décembre 2014
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Data Lover
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 96
    Par défaut
    Bonjour,

    Si ça ne marche pas la raison est que la moyenne que ta moyenne tu la calcules aléatoirement. Donc après l'exécution de cette ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df = df.loc[df.moyenne > 0.2]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    compo_df.append(df["nom_combinaison"][0])
    group_df.append(df["prenom"][0])
    La valeur que tu crois être la première n'est pas toujours vraie car parfois après ce filtre, ça peut être la 2ème ou la 3ème, etc. ligne qui devient ta 1ère valeur vraie (correspondant au filtre).

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Par défaut
    Merci pour ta réponse. J'ai malheureusement peur de ne pas comprendre :

    Pour moi, la formule suivante...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df = df.loc[df.moyenne > 0.2]
    ...garde la même forme que le dataframe de base à la différence que le filtre est appliquée. Si je n'ai que deux lignes de ma colonne "moyenne" qui est > 0.2, alors je me retrouve avec un dataframe à 2 lignes. Dans ce cas, je ne vois pas pourquoi la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    compo_df.append(df["nom_combinaison"][0])
    me reverrait une ligne avec une valeur de "moyenne" qui ne correspond pas au filtre. Peut-être, au lieu d'appliquer ce filtre sur lui même, devrais-je créer un autre dataframe avec un autre nom pour voir si cela change les choses ?

    Merci.

  4. #4
    Membre éclairé
    Homme Profil pro
    Data Lover
    Inscrit en
    Décembre 2014
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Data Lover
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 96
    Par défaut
    Si je n'ai que deux lignes de ma colonne "moyenne" qui est > 0.2, alors je me retrouve avec un dataframe à 2 lignes. Dans ce cas, je ne vois pas pourquoi la ligne
    Exactement ! Ça garde la même forme par contre, les indices de lignes ne changent pas. Essaie d'afficher ton dataframe après ce filtre pour voir quel est l'indice (index) de ta 1ère ligne.
    Supposons qu'il y avait 3 lignes dans ton dataframe comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    nom_combinaison	prenom	                                 moyenne
    0	Compo1	[Personne3, Personne5, Personne6]	0.177108
    1	Compo2	[Personne3, Personne4, Personne11]	0.532438
    2	Compo3	[Personne9, Personne11, Personne12]	-0.548051
    Ensuite, j'affiche les lignes restantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    df
    nom_combinaison	prenom	                                 moyenne
    1	Compo2	[Personne3, Personne4, Personne11]	0.532438
    Après application de ton filtre, il ne restera plus que la ligne 1 car la ligne 0 et 2 ne correspondent pas à celui-ci. Par conséquent, par la suite, quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compo_df.append(df["nom_combinaison"][0])
    Ça ne peut pas marcher car l'index 0 n'existe plus. Par contre, si tu mets 1 à la place de 0, ça va marcher. Ensuite, en fonction des cas, il pourrait encore y avoir des problèmes lors de l'exécution de ta boucle for car i prendra des valeurs qui n'existent parmi les index de ton dataframe.

  5. #5
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Juin 2018
    Messages
    180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Alimentation

    Informations forums :
    Inscription : Juin 2018
    Messages : 180
    Par défaut
    Un grand merci pour cette explication. Effectivement, je n'avais pas cette notion d'index pendant un tri.

    J'ai pu résoudre mon problème avec cette ligne magique, après avoir appliqué mon filtre sur mon df :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    df = df.reset_index(drop=True)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur 1004 sur une boucle simple
    Par ruzakruzak dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 06/07/2007, 09h00
  2. Réponses: 11
    Dernier message: 19/06/2006, 16h54
  3. Question rapide sur une requette simple
    Par batoubat dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/06/2006, 18h39
  4. Problème sur une boucle
    Par Mateache dans le forum ASP
    Réponses: 6
    Dernier message: 31/01/2006, 09h48
  5. Conseils sur une API simple pour Windows
    Par alejandro dans le forum Choisir un environnement de développement
    Réponses: 4
    Dernier message: 28/04/2005, 18h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo