Pandas : Comment ajouter des sous-totaux au tableau croisé dynamique



Souvent, vous souhaiterez peut-être ajouter des sous-totaux à un tableau croisé dynamique pandas.

Heureusement, cela est facile à faire en utilisant les fonctions intégrées aux pandas.

L’exemple suivant montre comment procéder.

Exemple : ajouter des sous-totaux au tableau croisé dynamique Pandas

Supposons que nous ayons le DataFrame pandas suivant qui contient des informations sur divers joueurs de basket-ball :

import pandas as pd

#create DataFrame
df = pd.DataFrame({'team': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
                   'position': ['G', 'G', 'F', 'F', 'G', 'F', 'F', 'F'],
                   'all_star': ['Y', 'N', 'Y', 'Y', 'N', 'N', 'N', 'Y'],
                   'points': [4, 4, 6, 8, 9, 5, 5, 12]})

#view DataFrame
print(df)

  team position all_star  points
0    A        G        Y       4
1    A        G        N       4
2    A        F        Y       6
3    A        F        Y       8
4    B        G        N       9
5    B        F        N       5
6    B        F        N       5
7    B        F        Y      12

Nous pouvons utiliser le code suivant pour créer un tableau croisé dynamique dans pandas qui affiche la somme des points pour chaque combinaison de team , all_star et position dans le DataFrame :

#create pivot table
my_table = pd.pivot_table(df, values='points',
                              index=['team', 'all_star'],
                              columns='position',
                              aggfunc='sum')

#view pivot table
print(my_table)

position          F    G
team all_star           
A    N          NaN  4.0
     Y         14.0  4.0
B    N         10.0  9.0
     Y         12.0  NaN

Supposons maintenant que nous souhaitions ajouter une ligne de sous-totaux qui affiche le sous-total des points pour chaque équipe et position.

Nous pouvons utiliser la syntaxe suivante pour ce faire :

#add subtotals row to pivot table
pd.concat([
    y.append(y.sum().rename((x, 'Total')))
    for x, y in my_table.groupby(level=0)
]).append(my_table.sum().rename(('Grand', 'Total')))

	position	F	G
team	all_star		
A	       N	NaN	4.0
               Y	7.0	4.0
           Total	7.0	8.0
B	       N	5.0	9.0
               Y	12.0	NaN
           Total	17.0	9.0
Grand	   Total	24.0	17.0

Nous avons maintenant deux lignes de sous-total qui montrent le sous-total des points pour chaque équipe et position, ainsi qu’une ligne de total général qui montre le total général de chaque colonne.

Remarque : Vous pouvez trouver la documentation complète de la fonction pandas pivot_table() ici .

Ressources additionnelles

Les didacticiels suivants expliquent comment effectuer d’autres opérations courantes dans les pandas :

Pandas : Comment créer un tableau croisé dynamique avec le nombre de valeurs
Pandas : comment remplacer les valeurs NaN dans le tableau croisé dynamique par des zéros
Pandas : Comment convertir un tableau croisé dynamique en DataFrame

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *