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 :

panda set_value et boucle for


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 45
    Par défaut panda set_value et boucle for
    Bonjour,

    j'ai un dataframe df (créé avec la librairie panda) sur lequel mon identifiant de ligne id (qui n'est pas l'index) est dupliqué car une colonne ("ma_colonne") a des données sur plusieurs lignes pour un même identifiant.
    Ce que je veux faire, c'est grouper les lignes de cette colonne en une seule. Ce que je fais avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    group_lines = df.groupby('id').apply(lambda x: ','.join(x['ma_colonne']))
    Je cherche ensuite les données de cette objet dans mon df pour modifier celui-ci. Je le fais avec cette boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for row in df.itertuples():
                  for i,v in group_lines.iteritems():
                      if row.id == i:
                              df.set_value(row.Index, 'ma_colonne', v)
    Ca marche, mais 2 problèmes: C'est très très long dès que mon df a plus de 10 000 lignes (puisque boucle sur 2 objets j'imagine....). Et la fonction set_value() va être déprecié dans la prochaine mise à jour de panda: ils disent de remplacer celle-ci par df.at[].

    Avez-vous une idée de comment améliorer cet algo?
    Merci

  2. #2
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut
    c1 ma_colonne
    1 a
    1 b
    1 c
    2 d
    3 d
    4 e
    4 f

    Quel est le filtrage souhaité ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 45
    Par défaut
    Bonjour

    je veux obtenir:

    1 a,b,c
    1 a,b,c
    1 a,b,c
    2 d
    3 d
    4 e,f
    4 e,f

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    j'ai ça qui semble faire le job, sans grande conviction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> df = pd.DataFrame([[1, 'a'],[1, 'b'],[1, 'c'],[2, 'd'],[3, 'd'],[4, 'e'],[4, 'f']], columns=['c1', 'ma_colonne'])
    >>> df['ma_colonne'] = df.apply(lambda x: df.groupby('c1').apply(lambda y: ','.join(y['ma_colonne']))[x[0]], axis=1)
    >>> df
       c1 ma_colonne
    0   1      a,b,c
    1   1      a,b,c
    2   1      a,b,c
    3   2          d
    4   3          d
    5   4        e,f
    6   4        e,f
    ou plus court (à voir si c'est aussi correct et/ou efficace) : df['ma_colonne'] = [','.join(df[df['c1'] == i]['ma_colonne']) for i in df['c1']]

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 45
    Par défaut
    ça marche merci beaucoup!

Discussions similaires

  1. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 16h07
  2. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  3. [Debutant] Batch et Boucle for
    Par ludovic.fernandez dans le forum Scripts/Batch
    Réponses: 8
    Dernier message: 06/05/2004, 19h21
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

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