web-dev-qa-db-fra.com

Comment utiliser groupby dans pandas pour calculer un pourcentage / proportion total en fonction d'un critère dans une autre colonne

J'essaie de savoir comment utiliser la fonction groupby dans pandas pour déterminer les proportions de valeurs par an avec un critère Oui/Non donné.

Par exemple, j'ai une trame de données appelée names:

  Name  Number  Year   Sex Criteria
0  name1     789  1998  Male      N
1  name1     688  1999  Male      N
2  name1     639  2000  Male      N
3  name2     551  1998  Male      Y
4  name2     499  1999  Male      Y

Je peux utiliser

namesgrouped = names.groupby(["Sex", "Year", "Criteria"]).sum()

obtenir:

                   Number
Sex    Year      Criteria
Male   1998 N        14507
            Y         2308
       1999 N        14119
            Y         2331

etc. Je voudrais que la colonne `` Critères numériques '' indique le% du total pour chaque sexe et année - donc au lieu de N = 14507 et Y = 2308 pour 1998 ci-dessus, j'aurais N = 86,27% et Y = 13,73%.

Quelqu'un peut-il me conseiller sur la façon de procéder?

8
fuzzy_logic_77

Cette question est une extension directe du doublon suggéré . Empruntant à la réponse acceptée, cela fonctionnera:

In [46]: namesgrouped.groupby(level=[0, 1]).apply(lambda g: g / g.sum())
Out[46]: 
                      Number
Sex  Year Criteria          
Male 1998 N         0.588806
          Y         0.411194
     1999 N         0.579612
          Y         0.420388
     2000 N         1.000000

Edit : une opération de transformation peut être plus rapide que d'appliquer:

namesgrouped / namesgrouped.groupby(level=[0, 1]).transform('sum')
23
IanS