114 votes

Étant donné une série pandas qui représente les fréquences d'une valeur, comment puis-je convertir ces fréquences en pourcentages?

Je faisais des expériences avec l'ensemble de données Titanic de kaggle.com (données sur chaque personne à bord du Titanic) et j'ai obtenu une répartition par genre comme ceci :

df = pd.DataFrame({'sex': ['homme'] * 577 + ['femme'] * 314})
gender = df.sex.value_counts()
gender

homme   577
femme   314

J'aimerais connaître le pourcentage de chaque genre à bord du Titanic.

Ma méthode est légèrement moins que idéale :

from __future__ import division
pcts = gender / gender.sum()
pcts

homme      0.647587
femme    0.352413

Y a-t-il une meilleure façon (plus idiomatique) de faire ?

257voto

fanfabbb Points 1874

Cette fonction est implémentée dans pandas, en fait même dans value_counts(). Pas besoin de calculer :)

il suffit de taper:

df.sex.value_counts(normalize=True)

ce qui donne exactement la sortie désirée.

Veuillez noter que value_counts() exclut les valeurs NA, donc les chiffres peuvent ne pas atteindre 1. Voir ici: http://pandas-docs.github.io/pandas-docs-travis/generated/pandas.Series.value_counts.html (Une colonne d'un DataFrame est une Series)

9 votes

Toute chose qui donne comme ci-dessous mâle 577 0,647587 femelle 314 0,352413 qui peut à la fois, compter et pourcentage côte à côte ??

40voto

Shahar Points 885

Si vous souhaitez afficher un pourcentage, l'une des choses que vous pouvez faire est d'utiliser value_counts(normalize=True) comme répondu par @fanfabbb.

Cela étant dit, dans de nombreux cas, vous voudrez l'afficher en pourcentage sur cent.

Cela peut être réalisé comme suit:

gender = df.sex.value_counts(normalize=True).mul(100).round(1).astype(str) + '%'

Dans ce cas, nous multiplions les résultats par cent, les arrondissons à un chiffre après la virgule et ajoutons le signe pourcentage.

30voto

Layla Points 323

Si vous souhaitez fusionner les comptes avec le pourcentage, vous pouvez utiliser :

c = df.sex.value_counts(dropna=False)
p = df.sex.value_counts(dropna=False, normalize=True)
pd.concat([c,p], axis=1, keys=['counts', '%'])

4 votes

Il devrait vraiment y avoir une option pour afficher cela automatiquement!

15voto

Andy Hayden Points 38010

Je pense que je le ferais probablement en une seule fois (sans importer de division):

1. * df.sex.value_counts() / len(df.sex)

ou peut-être, en se rappelant que vous voulez un pourcentage:

100. * df.sex.value_counts() / len(df.sex)

Plus ou moins la même chose, votre façon semble aussi bonne.

0 votes

J'aime cette approche car il n'est pas nécessaire d'importer future. Merci Hayden.

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