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

Tkinter Python Discussion :

ListBox Tkinter + pandas : récupération adresses de fichiers Excel


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Commercial
    Inscrit en
    Mars 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Commercial

    Informations forums :
    Inscription : Mars 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut ListBox Tkinter + pandas : récupération adresses de fichiers Excel
    Bonjour,

    Je débute en programmation et j'ai besoin de récupérer les adresses de fichiers Excel pour les convertir en coordonnées.

    Le problème étant que bien souvent les adresses sont reparties sur plusieurs colonnes (une avec nom rue, nom zone indu, nom ville, CP, Pays), à l'aide de 2 listbox (la première étant une liste des colonnes et la seconde servant à les récupérer) je récupère donc les noms des colonnes qui nous intéressent afin de pouvoir les regrouper en une colonne exploitable pour récupérer les coordoonées, j'avais trouvé ce code (exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    df['ADDRESS'] = 
                    df['Address1'].astype(str) + ',' + \
                    df['Address3'] + ',' + \
                    df['Address4'] + ',' + \
                    df['Address5'] + ','
    Je coince complétement ici, comment utiliser les noms des colonnes de la listbox2 avec le code ci-dessus afin de réussir à les regrouper en une seul colonne ?

    De type pour chaque nom de colonne dans le tableau
    Si nom colonne == nom listbox
    ajouter contenu à df[ADDRESS]

    Si vous avez des indices à me donner, je suis preneur,

    Si dessous mon code complet jusqu'ici si ça peut aider :

    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
     
     
    window = Tk()
    window.title("Mapping")
    window.geometry("900x600")
     
    filepath = askopenfilename(title="Ouvrir fichier Excel",filetypes=[('xlsx files','.xlsx'),('all files','.*')])
     
     
    df = pandas.read_excel(filepath)
     
    listbox = Listbox(window)
    listbox.pack()
    for index in df:
        listbox.insert(END, index)
     
    listbox2 = Listbox(window)
    listbox2.pack()
     
    def Addlist():
        Insert = listbox.curselection()
        Insert2 = listbox.get(Insert)
        listbox2.insert(END, Insert2)
     
    def Dellist():
        Dell = listbox2.curselection()
        listbox2.delete(Dell)
     
    b = Button(window, text="Add", command = Addlist)
    b.pack()
    c = Button(window, text="Suppr", command = Dellist)
    c.pack()
     
    window.mainloop()
    Merci d'avance pour votre aide,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 302
    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 302
    Points : 36 801
    Points
    36 801
    Par défaut
    Salut,

    Citation Envoyé par WBPYTHON Voir le message
    Je coince complétement ici, comment utiliser les noms des colonnes de la listbox2 avec le code ci-dessus afin de réussir à les regrouper en une seul colonne ?
    Il faudrait déjà voir à quoi ressemblent vos données et donner un petit exemple de ce que vous voulez faire car ce que vous racontez n'est pas si clair pour ceux qui n'ont pas le nez dedans.

    - W

  3. #3
    Candidat au Club
    Homme Profil pro
    Commercial
    Inscrit en
    Mars 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Commercial

    Informations forums :
    Inscription : Mars 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Hello,

    Merci pour ton retour,

    En fait le but est que ce programme fonctionne avec n'importe quel fichier excel importé.

    Donc mettons que j'ai un fichier de ce type:

    NOM ADR1 ADR2 ADR3 CONTACT
    HOME1 9 rue Javier 75000 PARIS FRANCE RAOUL
    HOME2 11 rue Alphonse 13000 MARSEILLE FRANCE FRED
    HOME3 13 rue Hervé 29000 BREST FRANCE RAYMOND

    Le but est de rassembler les colonnes ADR1 ADR2 et ADR3 en une colonne ADDRESS par exemple.

    Je donne ce tableur en exemple mais cela pourrait être un autre donc d'où ma listebox1 avec le nom des colonnes à choisir:
    NOM
    ADR1
    ADR2
    ADR3
    CONTACT

    et ma listbox2 ou je récupère via le boutton ADD les colonnes qui correspondent aux adresses, qui ressemblera à ça après
    ADR1
    ADR2
    ADR3

    une fois à cette étape je bloque pour fusionner ces 3 colonnes,

    J'ai trouvé ce morceau de code pour rassembler le contenu de plusieurs colonnes en une seule :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    df['ADDRESS'] = 
                    df['ADR1'].astype(str) + ',' + \
                    df['ADR2'] + ',' + \
                    df['ADR3'] + ',' +
    Mais comment lui dire d'utiliser les colonnes correspondant aux noms de la listbox2 car comme je le disais les noms des colonnes correspondant aux adresses sont amenées à changer d'un fichier à l'autre.

    En espérant avoir été plus clair,

    Merci d'avance,

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 302
    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 302
    Points : 36 801
    Points
    36 801
    Par défaut
    Salut,

    Citation Envoyé par WBPYTHON Voir le message
    Mais comment lui dire d'utiliser les colonnes correspondant aux noms de la listbox2 car comme je le disais les noms des colonnes correspondant aux adresses sont amenées à changer d'un fichier à l'autre
    Pas sûr d'avoir tout compris mais ADR1, ADR2, ADR3 sont des chaines de caractères que vous pouvez stpcker dans des variables a, b, c et, à partir de là, récupérer df[a], df[b], df[c].

    - W

  5. #5
    Candidat au Club
    Homme Profil pro
    Commercial
    Inscrit en
    Mars 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Commercial

    Informations forums :
    Inscription : Mars 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Hum, je n'arrive pas à m'exprimer clairement .

    En fait j'aimerais faire choisir à l'utilisateur les colonnes à sélectionner dans le fichier Excel afin de les utiliser dans le bout de code ci dessous. Ici dans l'exemple ADR1 2 et 3, mais il peut y en avoir que 2, 5 ou 1 et avec des noms differents.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    df['ADDRESS'] = 
                    df['ADR1'].astype(str) + ',' + \
                    df['ADR2'] + ',' + \
                    df['ADR3'] + ',' +

    J'avais pensé à 2 listbox (voir mon code), mais une fois que j'ai cette seconde listbox avec le nom des colonnes, comment les récupérer pour les intégrer dans les colonnes ci-dessous ?

    Peut-être il y a une méthode plus simple pour faire choisir des colonnes par l'utilisateur et les fusionner ?

    Bonne journée,

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 302
    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 302
    Points : 36 801
    Points
    36 801
    Par défaut
    Salut,

    Citation Envoyé par WBPYTHON Voir le message
    Ici dans l'exemple ADR1 2 et 3, mais il peut y en avoir que 2, 5 ou 1 et avec des noms differents.
    C'est ce qu'on appelle une liste.

    Partant d'une liste de chaines de caractères L, écrire une boucle du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df['ADDRESS'] = ', '.join(str(df[z]) for z in L)
    ou en plus délayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    items = []
    for z in L:
         items.append(str(df[z]))
    df['ADDRESS'] = ', '.join(items)
    n'est pas si compliqué.

    Citation Envoyé par WBPYTHON Voir le message
    Peut-être il y a une méthode plus simple pour faire choisir des colonnes par l'utilisateur et les fusionner ?
    On s'en fout un peu de comment l'utilisateur choisit sa liste de colonnes, votre problème est de "fusionner" en fonction de cette liste...

    - W

  7. #7
    Candidat au Club
    Homme Profil pro
    Commercial
    Inscrit en
    Mars 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Commercial

    Informations forums :
    Inscription : Mars 2020
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci pour vos conseils, on avance :

    J'enregistre dans une liste les colonnes sélectionnées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    liste = []
     
    def Addlist():
        Insert = listbox.curselection()
        Insert2 = listbox.get(Insert)
        listbox2.insert(END, Insert2)
        liste.append(Insert2)
    Ensuite je fusionne avec une boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def fusion():
        df["ADDRESS"] = 0 
        for z in liste:
     
            df["ADDRESS"] = df["ADDRESS"].astype(str) + df[z].astype(str) + ","
     
        print(df["ADDRESS"])    
     
    d = Button(window, text="LANCER FUSION", command = fusion)
    Et cela fonctionne:

    ADDRESS:
    09rue Javier, 75000, PARIS, FRANCE,
    011rue Alphonse, 13000 MARSEILLE, FRANCE,

    En revanche les problèmes sont que, j'ai forcement le "0" devant le début d'adresse et un "," de trop à la fin, également si une cellule des colonnes est vide j'ai un "nan" qui s'insère. Pour améliorer, est-il possible sur pandas de :
    - remplir automatiquement les cellules vides de ADR1, ADR2 et ADR3 par ZXY (et mettre en même temps ZXY à la place de 0 pour ADDRESS par défaut)
    - supprimer ZXY des cellules de la colonne ADDRESS
    - supprimer le dernier caractère des cellules de la colonne ADDRESS

    Merci d'avance,

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 302
    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 302
    Points : 36 801
    Points
    36 801
    Par défaut
    Citation Envoyé par WBPYTHON Voir le message
    En revanche les problèmes sont que, j'ai forcement le "0" devant le début d'adresse et un "," de trop à la fin, également si une cellule des colonnes est vide j'ai un "nan" qui s'insère.
    Le 0 au début, c'est vous qui l'avez mis.
    Le ',' à la fin ne serait pas là si vous aviez pris le temps de comprendre comment fonctionne la méthode .join (qui est dans mon exemple).
    Vous pouvez tester le contenu de la colonne et la sauter si elle contient Nan.

    Çà serait bien d'ouvrir un tuto. pour (re)voir les bases sur les chaines de caractères, les conditions,... Car pour écrire de vrais programmes (autre chose que les exercices proposés dans les tutos), il faut savoir programmer un minimum. Et vu comment vous posez le problème que vous cherchez à résoudre, vous êtes bien en deçà.


    - W

Discussions similaires

  1. [Toutes versions] Bogage listbox lors de l'ouverture du fichier excel.
    Par maxime00001 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 04/03/2019, 16h50
  2. [XL-2010] Récupération d'un fichier excel endommagé
    Par nassiri dans le forum Excel
    Réponses: 4
    Dernier message: 03/01/2014, 15h10
  3. [XL-2000] Récupération données plusieurs fichiers excel
    Par flosauveur69 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/09/2010, 14h13
  4. récupération dynamique cellule fichier Excel type
    Par imagonem dans le forum Excel
    Réponses: 2
    Dernier message: 04/03/2009, 09h05
  5. Réponses: 12
    Dernier message: 22/06/2006, 12h09

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