Voici un exemple simplifié de mon df:
ds = pd.DataFrame(np.abs(randn(3, 4)), index=[1,2,3], columns=['A','B','C','D'])
ds
A B C D
1 1.099679 0.042043 0.083903 0.410128
2 0.268205 0.718933 1.459374 0.758887
3 0.680566 0.538655 0.038236 1.169403
Je voudrais résumer les données dans les colonnes par ligne:
ds['sum']=ds.sum(axis=1)
ds
A B C D sum
1 0.095389 0.556978 1.646888 1.959295 4.258550
2 1.076190 2.668270 0.825116 1.477040 6.046616
3 0.245034 1.066285 0.967124 0.791606 3.070049
Maintenant, voici ma question! Je voudrais créer 4 nouvelles colonnes et calculer la valeur en pourcentage à partir du total (somme) dans chaque ligne. La première valeur de la première nouvelle colonne doit donc être (0,095389/4,258550), la première valeur de la deuxième nouvelle colonne (0,556978/4,258550) ... et ainsi de suite ... Aide s'il vous plaît
Vous pouvez le faire facilement manuellement pour chaque colonne comme ceci:
df['A_perc'] = df['A']/df['sum']
Si vous souhaitez effectuer cette opération en une seule étape pour toutes les colonnes, vous pouvez utiliser la méthode div
( http://pandas.pydata.org/pandas-docs/stable/basics.html#matching -broadcasting-behavior ):
ds.div(ds['sum'], axis=0)
Et si vous voulez que cela en une seule étape soit ajouté à la même trame de données:
>>> ds.join(ds.div(ds['sum'], axis=0), rsuffix='_perc')
A B C D sum A_perc B_perc \
1 0.151722 0.935917 1.033526 0.941962 3.063127 0.049532 0.305543
2 0.033761 1.087302 1.110695 1.401260 3.633017 0.009293 0.299283
3 0.761368 0.484268 0.026837 1.276130 2.548603 0.298739 0.190013
C_perc D_perc sum_perc
1 0.337409 0.307517 1
2 0.305722 0.385701 1
3 0.010530 0.500718 1
In [56]: df = pd.DataFrame(np.abs(randn(3, 4)), index=[1,2,3], columns=['A','B','C','D'])
In [57]: df.divide(df.sum(axis=1), axis=0)
Out[57]:
A B C D
1 0.319124 0.296653 0.138206 0.246017
2 0.376994 0.326481 0.230464 0.066062
3 0.036134 0.192954 0.430341 0.340571