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 :

Problème création de nouvelles variables dans un data frame


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Par défaut Problème création de nouvelles variables dans un data frame
    Bonjour à toutes et à tous,

    Je cherche à créer de nouvelles variables filles issues d'une variable mère. Dans mon cas, le problème vient du type d'objet. En effet, lorsque j'extrait les données de ma variable, il assimile ma nouvelle variable comme une liste. J'ai alors essayé de convertir mon ma variable en string, mais rien n'y fait, la même erreur revient.

    Voici mon code :
    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
    with open('bd', 'w') as fout, fileinput.input(list_fichier) as fin:
        for line in fin:
            if "^-^" not in line:
                fout.write(line)
        file_path=r'path'
        bd_final=pd.read_csv(file_path, sep='^',header=None,names=['id_c','id_p','id_s'])
    print(bd_final)
     
    id_personne=str(bd_final['id_p'])
    for line in id_personne:
        id_p3=id_personne[id_personne.find('=')+1:-1]
        if id_p3.find('|')!=-1:
            id_p2=id_p3.split(id_p3[1:id_p3.find('|')-1])
        else:
            id_p2=id_p3.split(id_p3)
        if id_p2[1:2]=='{':
            id_p=id_p2[2:id_p2.find('{')-2]
        else:
            id_p=id_p2.split(id_p2)
    print(id_p)
    Cependant, je me retrouve avec le message d'erreur suivant :AttributeError: 'list' object has no attribute 'find'

    J'ai essayé de manipuler la seconde partie de mon code pour parcourir chaque élément dans ma liste comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    id_personne=bd_final['id_p']
    for line in id_personne:
        id_p3=id_personne[id_personne.find('=')+1:-1]
        for line in id_p3:
            if id_p3.find('|')!=-1:
                id_p2=id_p3.split(id_crm_p3[1:id_p3.find('|')-1])
            else:
                id_p2=id_p3.split(id_p3)
        for line in id_p2:
            if id_p2[1:2]=='{':
                id_p=id_p2[2:id_p2.find('{')-2]
            else:
                id_p=id_p2.split(id_p2)
    print(id_p)
    Cette fois-ci, c'est l'erreur suivante qui ressort dans la console : AttributeError: 'Series' object has no attribute 'find'

    Est-ce que quelqu'un aurait une idée pour me débloqué sur ce problème ? Merci d'avance pour votre temps et vos conseils!

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Par défaut Eclaircissement
    Bonjour,

    Pour bien faire comprendre ce que je cherche à obtenir avec mon code, voici comment se présente mon fichier de base :

    id_c id_p id_s
    value1a id_p=M5A77424A0006012|id_p=17522131 value3a
    value1b id_p=12465107 value3b
    value1c id_p={7479223} value3c

    Comme vous pouvez le voir, j'ai plusieurs identifiants dans ma variable id_p. Je voudrais créer 3 variables qui récupèrerait ça :
    id_c id_p id_s id_p3 id_p2 id_final
    value1a id_p=M5A77424A0006012|id_p=17522131 value3a M5A77424A0006012|id_p=17522131 17522131 17522131
    value1b id_p=12465107 value3b 12465107 12465107 12465107
    value1c id_p={7479223} value3c {7479223} {7479223} 7479223

    Je l'ai déjà encodé en SAS donc je me dis qu'en python il ne devrait pas y avoir de problème. Si jamais la création d'identifiants intermédiaires n'est pas nécessaire, ou que quelqu'un à une idée quelconque, n'hésitez surtout pas!

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 704
    Par défaut
    Salut,

    Techniquement, une variable Python n'est pas la colonne d'un fichier texte (fut-il CSV).
    Et fabriquer '12465107' à partir de 'ip=12465107', c'est juste écrire 'ip=12465107'[5:]. C'est un opération plutôt simple sur les chaînes de caractères non? En tout cas, soit vous vous compliquez la vie soit ce que vous voulez faire est incompréhensible (vu le nombre de réponses...).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Par défaut
    Salut,
    C'est effectivement une colonne d'un fichier csv que j'aimerais traiter.
    En soit, l'opération que vous me décrivez, pour un cas particulier, je l'ai d'hors et déjà réalisée et je suis d'accord, cela n'a rien de compliqué. Cependant, comme vous avez pu le voir sur mon cas exemple, l'utilisation de la commande substring sur cette chaine ('ip=12465107'[5:]) n'englobera pas tous les individus présents dans mon fichier (160 000 individus)
    Pour vous donner une idée plus claire de ce que je veux faire, voici un exemple sur un échantillon réduit :

    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
     
    lines = ("value1a^id_p=M5A77424A0006012|id_p=17522131^value3a",
             "value1b^id_p=12465107^value3b",
             "value1c^id_p={7479223}^value3c")
     
    for line in lines:
        id_c, id_p, id_s = line.split("^")
     
        _, *end = id_p.split("=")
        if len(end) == 2:
            id_p3 = "=".join(end)
            id_p2 = id_final = end[-1]
        else:
            end = end[-1]
            if "{" in end:
                id_p3 = id_p2 = end
                id_final = end[1:-1]
            else:
                id_p3 = id_p2 = id_final = end
     
        print(id_c, id_p, id_s, id_p3, id_p2, id_final)
    Je n'arrive pas à appliquer ce code exemple sur tous les individus de mon fichier csv. Lorsque je l'inclus dans mon bloc d'écriture, je reçois le message suivant : io.UnsupportedOperation: not readable
    Voici mon code actuel :
    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
    with open('bd_final.csv', 'w',newline='') as fout, fileinput.input(list_fichier) as fin:
    #    fout.write('id_c^id_p^id_s\n')
        for line in fin:
            if "^-^" not in line:
                fout.write(line)
                for line in fout:
                    id_c, id_p, id_s = line.split("^")
     
                    _, *end = id_crm.split("=")
                    if len(end) == 2:
                        id_p3 = "=".join(end)
                        id_p2 = id_final = end[-1]
                    else:
                        end = end[-1]
                        if "{" in end:
                            id_p3 = id_p2 = end
                            id_final = end[1:-1]
                        else:
                            id_p3 = id_p2 = id_final = end
    Est-ce que cela vous parait plus compréhensible ?

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 704
    Par défaut
    Citation Envoyé par PLHOST56 Voir le message
    C'est effectivement une colonne d'un fichier csv que j'aimerais traiter.
    En soit, l'opération que vous me décrivez, pour un cas particulier, je l'ai d'hors et déjà réalisée et je suis d'accord, cela n'a rien de compliqué. Cependant, comme vous avez pu le voir sur mon cas exemple, l'utilisation de la commande substring sur cette chaine ('ip=12465107'[5:]) n'englobera pas tous les individus présents dans mon fichier (160 000 individus)
    Ben il suffit d'itérer sur l'ensemble des lignes du fichier, non?
    Citation Envoyé par PLHOST56 Voir le message
    Je n'arrive pas à appliquer ce code exemple sur tous les individus de mon fichier csv. Lorsque je l'inclus dans mon bloc d'écriture, je reçois le message suivant : io.UnsupportedOperation: not readable
    C'est ce qui arrive lorsqu'on essaie d'écrire dans un fichier ouvert en écriture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> f = open('toto.txt', 'w')
    >>> f.read()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    io.UnsupportedOperation: not readable
    >>>
    Et le code que vous montrez est bien plus compliqué que le besoin décrit précédemment. Dans le cas le plus simple est de fabriquer une fonction qui prend l'item de la colonne en argument et qui retourne ce qu'il faut: c'est plus facile à tester et çà fait beaucoup moins de lignes de code à recopier.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 053
    Par défaut
    Autre solution pour virer l'idp à gauche,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    s1 = 'id_p=12465107'
    s2 = 'id_p=M5A77424A0006012|id_p=17522131'
    for s in (s1, s2):
        print(s.lstrip('id_p='))
    
    # 12465107
    # M5A77424A0006012|id_p=17522131

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Par défaut
    Merci beaucoup pour vos réponses!

    Wiztricks, je suis d'accord, je me compliquais carrément la vie en récupérant les id_intermédiaires, j'ai suivi tes conseils pour simplifier un peu mon traitement. Je n'ai pas réalisé de fonctions mais j'ai écrit les lignes de codes suivantes afin de répondre à mon problème :

    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
    37
    38
    39
    40
    41
    42
    43
    test=open("ma_db.csv","r")
    data_p1=[]
    data_p2=[]
    data_p3=[]
    for line in test:
        # Découpage de nos variables avec le séparateur : fonction split()
        id_c, id_p, id_s = line.split("^")
     
        # _ récupère 'id_p' ou'ap_p' | *end concatène chaque liste on obtient des chaines de caractères
        #  end correspond aux listes des id de chaque individus
     
        _, *end = id_p.split("=")
     
        # si end a 3 éléments dans sa liste alors on récupère le dernier élément
        if len(end) == 3:
            id_p3 = end[2]
            if '{' in id_p3:
                id_p3=id_p3[1:-1]
            id_p3_test=id_p3.split('\n')
            data_p3.append(id_p3_test)
     
        elif len(end) == 2:
            id_p2=end[1]
            if '{' in id_p2:
                id_p2=id_p2[1:-1]
            id_p2_test=id_p2.split('\n')
            data_p2.append(id_p2_test)
     
        elif len(end) == 1:
            id_p1=end[0]
     
            if '{' in id_p1:
                id_p1=id_p1[1:-1]
            id_p1_test=id_p1.split('\n')
            data_p1.append(id_p1_test)
     
    # Création de séries pour les concaténer après 
    serie_1 = pd.Series((v[0] for v in data_p1))
    serie_2 = pd.Series((v[0] for v in data_p2))
    serie_3 = pd.Series((v[0] for v in data_p3))
     
    # Concaténation de mes séries
    id_p_propre=pd.concat([serie_1, serie_2,serie_3], ignore_index=True)
    Je vous l'accorde, ce n'est pas le plus simplifié possible, je vais essayer ta méthode pour simplifier ça Fred1599, mais je récupère ce dont j'ai besoin!

    Il me reste une dernière étape qui est de récupérer les id_c et les id_s qui correspondent à mes id_p_propre extrait. J'ai essayé de les intégrer en utilisant des listes avec index, mais du coup mon traitement ne fonctionne plus... Une fois que j'aurais réussi cette partie, je réaliserai une fonction qui reprend tout mon traitement, mais je bute sur ce problème d'intégration et de matching de mes id_c et id_s à mes id_p.
    Est-ce que vous auriez une piste? Je vous remercie d'avance!

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2015
    Messages : 12
    Par défaut Problème résolu
    Bonjour à toutes et à tous,

    J'ai trouvé une solution à mon problème final, un peu barbare pour l'instant mais ça fonctionne :

    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
    37
    38
     
    import pandas as pd
    test=open("ma_db.csv","r")
    data_p1=[]
    data_p2=[]
    data_p3=[]
    # Parcours de toutes les lignes de notre fichier en lecture
    for line in test:
        # Découpage de nos variables avec le séparateur : fonction split()
        id_c, id_p, id_s = line.split("^")
        _, *end = id_p.split("=")
        # end correspond aux listes des id de chaque individus
        # si end a 3 éléments dans sa liste alors on récupère le dernier élément
        if len(end) == 3:
            id_p3 = end[2]
            if '{' in id_p3:
                id_p3=id_p3[1:-1]
            variables=id_c_3,id_p3_test,id_s_3=(id_c,id_p3,id_s[0:-2])
            vars_3=list(variables)
            data_p3.append(vars_3)
        elif len(end) == 2:
            id_p2=end[1]
            if '{' in id_p2:
                id_p2=id_p2[1:-1]
            variables=id_c_2,id_p2_test,id_s_2=(id_c,id_p2,id_s[0:-2])
            vars_2=list(variables)
            data_p2.append(vars_2)
        elif len(end) == 1:
            id_p1=end[0]
            if '{' in id_p1:
                id_p1=id_p1[1:-1]
            variables=id_c_1,id_p1_test,id_s_1=(id_c,id_p1,id_s[0:-1])
            vars_1=list(variables)
            data_p1.append(vars_1)
    df_1 = pd.DataFrame(data_p1, columns = ['id_c','id_p_propre','id_s'])
    df_2 = pd.DataFrame(data_p2, columns = ['id_c','id_p_propre','id_s'])
    df_3 = pd.DataFrame(data_p3, columns = ['id_c','id_p_propre','id_s'])
    ma_db_propre=pd.concat([df_1, df_2,df_3], ignore_index=False)
    Je vais m'attaquer à la fonction dés à présent, je mets quand même le sujet résolu.
    Merci à tous dans tous les cas! Bonne journée!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/05/2018, 10h10
  2. création nouvelle variable dans table existante
    Par meuah dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 16/05/2008, 10h00
  3. Probléme pour insérer une variable dans un champs
    Par BOUTRAIS dans le forum Access
    Réponses: 2
    Dernier message: 11/04/2006, 22h45
  4. problème de visibilité des variables dans un include
    Par d1g-2-d1g dans le forum Langage
    Réponses: 6
    Dernier message: 28/11/2005, 09h35
  5. [EasyPHP] problème de visibilité des variable dans les includes
    Par d1g-2-d1g dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 23/10/2005, 01h55

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