Comment faire un panda tableau croisé avec des pourcentages?
Donné un dataframe avec différentes variables catégorielles, comment puis-je retourner un croisement avec des pourcentages au lieu de fréquences?
df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 6,
'B' : ['A', 'B', 'C'] * 8,
'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4,
'D' : np.random.randn(24),
'E' : np.random.randn(24)})
pd.crosstab(df.A,df.B)
B A B C
A
one 4 4 4
three 2 2 2
two 2 2 2
En utilisant les marges de l'option dans le tableau croisé de calcul de ligne et de colonne des totaux de nous assez proche à penser qu'il devrait être possible à l'aide d'un aggfunc ou groupby, mais mon pauvre cerveau ne peut pas penser.
B A B C
A
one .33 .33 .33
three .33 .33 .33
two .33 .33 .33
- Ne serait-il pas s'attendre à la table à
0.167 0.167 0.167\n 0.083 0.083 0.083\n 0.083 0.083 0.083
? - Je suppose que vous voulez spécifiquement le "pour cent au sein de la ligne" (par exemple, en.wikipedia.org/wiki/Crosstab).
- Dans les Pandas 0.18.1, il semble que vous pouvez passer normaliser="index" pour diviser chaque entrée dans la ligne de la somme .
Vous devez vous connecter pour publier un commentaire.
Fondamentalement, vous avez juste la fonction qui fait
row/row.sum()
, et que vous utilisezapply
avecaxis=1
de l'appliquer en ligne.(Si cela en Python 2, vous devez utiliser
from __future__ import division
pour s'assurer de la division retourne toujours un char.)from __future__ import division
à force floating point de la division sur les nombres entiers.De Pandas 0.18.1 partir, il y a un
normalize
option:Où vous pouvez normaliser sur
all
,index
(lignes), oucolumns
.Plus de détails sont disponibles dans la documentation.
Nous pouvons montrer que les pourcentages en multipliant par
100
:Où j'ai arrondi pour plus de commodité.
Si vous êtes à la recherche d'un pourcentage du total de l', vous pouvez diviser par le len de la df au lieu de la ligne de la somme:
Une autre option est d'utiliser div plutôt que de l'appliquer:
Diviser par la somme sur l'indice:
Similaire à ci-dessus, vous avez besoin de faire quelque chose au sujet de division entière (j'utilise astype('float')):
Normalisation de l'indice sera tout simplement marcher. Utiliser le paramètre,
normalize = "index"
danspd.crosstab()
.