2 votes

Comment ajouter des sous-totaux à groupby et classer ces sous-totaux par ordre décroissant ?

Exemple d'ensemble de données (Notez que chaque combinaison de Col_A et Col_B est unique) :

import pandas as pd

d = {'Col_A': [1,2,3,4,5,6,9,9,10,11,11,12,12,12,12,12,12,13,13], 
     'Col_B': ['A','K','E','E','H','A','J','A','L','A','B','A','J','C','D','E','A','J','L'],
     'Value':[180,120,35,654,789,34,567,21,235,83,234,648,654,234,873,248,45,67,94]
    }

df = pd.DataFrame(data=d)

Sample Data

L'exigence est de générer un tableau avec le montant de chaque Col_B, les comptes de Col_A, et le montant total par Col_A. Affichez les catégories de Col_B dans l'ordre décroissant de leur montant total.

Voici ce que j'ai jusqu'à présent :

df.groupby(['Col_B','Col_A']).agg(['count','sum'])

La sortie ressemblerait à ceci. Cependant, j'aimerais ajouter des sous-totaux pour chaque catégorie de Col_B et classer ces sous-totaux des catégories dans l'ordre décroissant afin de remplir l'exigence d'obtenir le montant de chaque Col_B.

enter image description here

Merci d'avance à tous !

2voto

Corralien Points 6849

Le résultat attendu n'est pas clair pour moi mais est-ce ce que vous recherchez ?

piv = df.groupby(['Col_B', 'Col_A'])['Amount'].agg(['count','sum']).reset_index()
tot = piv.groupby('Col_B', as_index=False).sum().assign(Col_A='Total')
cat = pd.CategoricalDtype(tot.sort_values('sum')['Col_B'], ordered=True)

out = pd.concat([piv, tot]).astype({'Col_B': cat}) \
        .sort_values('Col_B', ascending=False, kind='mergesort') \
        .set_index(['Col_B', 'Col_A'])

>>> out
             count   sum
Col_B Col_A             
J     9          1   567
      12         1   654
      13         1    67
      Total      3  1288
A     1          1   180
      6          1    34
      9          1    21
      11         1    83
      12         2   693
      Total      6  1011
E     3          1    35
      4          1   654
      12         1   248
      Total      3   937
D     12         1   873
      Total      1   873
H     5          1   789
      Total      1   789
L     10         1   235
      13         1    94
      Total      2   329
C     12         1   234
      Total      1   234
B     11         1   234
      Total      1   234
K     2          1   120
      Total      1   120

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