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

Bibliothèques tierces Python Discussion :

Pandas - Groupby - count - données transformées en colonnes


Sujet :

Bibliothèques tierces Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Pandas - Groupby - count - données transformées en colonnes
    Bonjour,

    je me trouve face un un problème et la foison d'informations sur le net me rend inefficace à faire ce que je tente de faire...

    voila ce que je cherche a faire à l'aide de Pandas:
    j'ai un df de ce genre:
    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
    df = pd.DataFrame({
         'sec_Id':["to","ti","tu","ta","ty","te"], 
         'sec_Orga':['CNP','COF','COF','POS','POS','POS'], 
         'sec_Etat':['Sorti(e)','Valide','Suspendu(e)','Valide','Suspendu(e)','Suspendu(e)']
         })
     
    df
    Out[59]: 
          sec_Etat sec_Id sec_Orga
    0     Sorti(e)     to      CNP
    1       Valide     ti      COF
    2  Suspendu(e)     tu      COF
    3       Valide     ta      POS
    4  Suspendu(e)     ty      POS
    5  Suspendu(e)     te    POS
    je recherche avoir des totaux avec "groupby":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    df.groupby(['sec_Orga','sec_Etat'])['sec_Id'].count()
    Out[61]: 
    sec_Orga  sec_Etat   
    CNP       Sorti(e)       1
    COF       Suspendu(e)    1
              Valide         1
    POS       Suspendu(e)    2
              Valide         1
    Name: sec_Id, dtype: int64
    mais le résultat me convainc pas car j'aimerais "retourner" le resultat de sec_Etat pour que cela devienne des colonnes...
    quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          Total Valide Suspendu(e) Sorti(e)
    CNP   1                        1
    COF   2     1      1
    POS   3     1      2
    pour compliquer le tout il faut aussi que j’obtienne le total de chaque sec_Orga juxtaposé tu total décomposé par Valide, Suspendu(e) et Sorti(e)...

    auriez vous une idée comment m'y prendre? une piste?

    autre chose, je doit exporter le résultat dans un fichier, pour un df pas de soucis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dfMain.to_csv(path_or_buf=resPathFile, sep=resSep, index=False, encoding='utf-8')
    mais pour un "groupby" ca marche aussi un export csv?

    je vous remercie de votre attention, et bientôt de votre réponse

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Chargé d'études statistiques
    Inscrit en
    Novembre 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études statistiques

    Informations forums :
    Inscription : Novembre 2015
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Dans un premier temp, tu peux stocker ton résultat dans un DataFrame multi-index.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df_groupby=df.groupby(['sec_Orga','sec_Etat']).count()
    Ensuite tu as deux façon de faire.

    1. Il faut garder les index et utiliser la fonction unstack pour faire pivoter l'index souhaité. Afin d'avoir un format correct, on supprime le premier niveau d'index sur les colonnes via la fonction droplevel.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      resultat=df_groupby.unstack('sec_Etat')
      resultat.columns=resultat.columns.droplevel(0)
    2. Il faut réinitialiser les index afin de pouvoir utiliser la fonction pivot.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      resultat=df_groupby.reset_index()
      resultat=resultat.pivot(index='sec_Orga',columns='sec_Etat',values='sec_Id')
    Après quoi, tu remplaces les valeurs manquantes par 0 en utilisant la fonction fillna.
    Pour créer la colonne total, tu peux utiliser la fonction sum sur les colonnes (axis=1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    resultat=resultat.fillna(0)               
    resultat['Total']=resultat.sum(axis=1)
    Tu peux alors réaliser un export de ton résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat.to_csv('C:\TEMP\export_pandas.csv', sep=',', encoding='utf-8')
    Cordialement,
    Laurent.

Discussions similaires

  1. Transformer des colonnes en lignes
    Par marman dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/11/2006, 17h43
  2. Réponses: 3
    Dernier message: 26/07/2006, 14h58
  3. Réponses: 5
    Dernier message: 16/06/2006, 22h39
  4. Effacer toutes les données d'une colonne
    Par denisfavre dans le forum Access
    Réponses: 5
    Dernier message: 12/10/2005, 15h20
  5. transformer des colonnes en lignes
    Par flonardi dans le forum Oracle
    Réponses: 13
    Dernier message: 28/10/2004, 12h43

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