2 votes

Groupement Pandas - Les valeurs en pourcentage des totaux groupés ne fonctionnent pas

À l'aide d'un cadre de données et de pandas, j'essaie de déterminer ce que représente chaque valeur en pourcentage du total général pour la catégorie "group by".

Donc, en utilisant la base de données des conseils, je veux voir, pour chaque sexe/fumeur, quelle est la proportion de la facture totale pour les femmes fumeuses / toutes les femmes et pour les femmes non-fumeuses / toutes les femmes (et la même chose pour les hommes).

Par exemple,

Si l'ensemble des données est complet :

Sex, Smoker, Day, Time, Size, Total Bill
Female,No,Sun,Dinner,2, 20
Female,No,Mon,Dinner,2, 40
Female,No,Wed,Dinner,1, 10
Female,Yes,Wed,Dinner,1, 15

Les valeurs de la première ligne seraient (20+40+10)/(20+40+10+15), car ce sont les trois autres valeurs pour les femmes non fumeuses.

La sortie devrait donc ressembler à

Female No 0.823529412
Female Yes 0.176470588

Cependant, je semble avoir quelques problèmes

Quand je fais ça,

import pandas as pd
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-   book/master/ch08/tips.csv", sep=',')
df.groupby(['sex', 'smoker'])[['total_bill']].apply(lambda x: x / x.sum()).head()

J'obtiens ce qui suit :

    total_bill
0   0.017378
1   0.005386
2   0.010944
3   0.012335
4   0.025151

Il semble qu'il ignore le groupe par et le calcule juste pour chaque article de ligne.

Je cherche plutôt quelque chose comme

df.groupby(['sex', 'smoker'])[['total_bill']].sum()

Qui reviendra

        total_bill
sex smoker  
Female  No  977.68
        Yes 593.27
Male    No  1919.75
       Yes  1337.07

Mais je veux que cela soit exprimé en pourcentages des totaux pour le total des combinaisons individuelles sexe/fumeur ou

Female No  977.68/(977.68+593.27)
Female Yes  593.27/(977.68+593.27)
Male No  1919.75/(1919.75+1337.07)
Male Yes  1337.07/(1919.75+1337.07)

Idéalement, j'aimerais faire de même avec la colonne "conseil" en même temps.

Qu'est-ce que je fais de mal et comment puis-je réparer ça ? Merci.

7voto

Psidom Points 115100

Vous pouvez ajouter un autre processus groupé par processus après avoir obtenu l'option sum pour calculer le pourcentage :

(df.groupby(['sex', 'smoker'])['total_bill'].sum()
   .groupby(level = 0).transform(lambda x: x/x.sum()))   # group by sex and calculate percentage

#sex     smoker
#Female  No        0.622350
#        Yes       0.377650
#Male    No        0.589455
#        Yes       0.410545
#dtype: float64

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X