Fonction DataFrame.pivot_table() de Pandas
df.pivot_table()est une méthode membre de DataFrame, utilisée pourcréer un tableau croisé dynamique. Elle estpivot()une version améliorée de, prend en charge les opérations d’agrégation et peut gérer les combinaisons en double d’indices de ligne et de colonne.
Le tableau croisé dynamique est l’un des outils les plus couramment utilisés dans l’analyse de données. Il peut regrouper, résumer et remodeler les données sous différents angles, ce qui facilite la découverte de modèles et de tendances dans les données.
Définition du mot: pivot_tabledésigne « tableau croisé dynamique », un tableau qui peut modifier dynamiquement la disposition des données et prend en charge l’agrégation automatique des données en double.
Syntaxe de base et paramètres
df.pivot_table()est une méthode d’instance de DataFrame, appelée via l’opérateur point.
Format de syntaxe
DataFrame.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
Description du paramètre
- Paramètre:
index- Type : nom de colonne, étiquette, liste d’étiquettes ou None.
- Description : colonne utilisée comme index de ligne. Elle peut être une seule colonne ou plusieurs colonnes (liste) ; plusieurs colonnes créent un index hiérarchique.
- Paramètre:
columns- Type : nom de colonne ou étiquette.
- Description : colonne utilisée comme index de colonne, utilisée pour étendre les valeurs uniques en noms de colonnes.
- Paramètre:
values- Type : nom de colonne, étiquette, liste d’étiquettes ou None.
- Description : colonnes numériques à agréger. Si non spécifiées, toutes les colonnes numériques sont agrégées.
- Paramètre:
aggfunc- Type : fonction, chaîne de caractères ou liste de fonctions.
- Description : Fonction d'agrégation. Les valeurs courantes incluent
'sum'(sum),'mean'(mean, par défaut),'count'(count),'min'(min),'max'(max),'median'(médiane),'std'(écart type), etc.
- Paramètre:
fill_value- Type : scalaire ou None.
- Description : La valeur utilisée pour remplir les valeurs manquantes. La valeur par défaut est None, ce qui préserve NaN.
- Paramètre:
margins- Type : booléen.
- Description : Indique s'il faut ajouter les totaux de lignes et de colonnes. Par défaut, False. Lorsque la valeur est True, des données récapitulatives sont ajoutées à la fin des lignes et des colonnes.
- Paramètre:
margins_name- Type : string.
- Description : Le nom de la ligne/colonne de total, vaut 'All' par défaut. Valide uniquement lorsque margins=True.
Description de la fonction
- Valeur de retour: Renvoie un DataFrame, c'est-à-dire le tableau croisé dynamique.
- Fonctionnalités: Contrairement à
pivot(),pivot_table()ne lève pas d'erreur pour les combinaisons dupliquées index+colonnes, et utilise automatiquementaggfuncpour l'agrégation.
Exemples
Maîtrisons à fond à travers une série d'exemples, du simple au complexedf.pivot_table()l'utilisation de.
Exemple 1 : Utilisation de base - Créer un tableau croisé dynamique simple
Exemple
# 1. Créer des données de ventes
sales = pd.DataFrame({
'product': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],
'region': ['North', 'North', 'North', 'South', 'South', 'South', 'East', 'East', 'Est', 'Ouest', 'Ouest', 'Ouest'],
'sales': [100, 150, 200, 180, 170, 160, 190, 200, 210, 220, 230, 240]
})
print("=== Données de ventes ===")
print(sales)
# 2. Créer un tableau croisé dynamique - résumer les ventes par produit et par région (la fonction d'agrégation par défaut est la moyenne)
pivot = sales.pivot_table(values='sales', index='product', columns='region', aggfunc='sum')
print("n=== df.pivot_table() Tableau croisé dynamique des ventes (Somme)===")
print(pivot)
Sortie attendue :
=== 销售数据 ===
product region sales
0 A North 100
1 B North 150
2 C North 200
3 A South 180
4 B South 170
5 C South 160
6 A East 190
7 B East 200
8 C East 210
9 A West 220
10 B West 230
11 C West 240
=== df.pivot_table() 销售透视表(求和)===
region East North South West
product
A 190 100 180 220
B 200 150 170 230
C 210 200 160 240
Explication du code :
- Les données d'origine sont au format long, chaque ligne enregistrant les ventes d'un produit dans une certaine région.
pivot_table()Utilise product comme index de ligne, region comme index de colonne, et sales comme valeurs.- Utiliser
aggfunc='sum'pour faire la somme et résumer les ventes. - Le résultat est un tableau bidimensionnel clair, ce qui facilite la comparaison des performances de vente des différents produits dans différentes régions.
Exemple 2 : Utilisation de différentes fonctions d’agrégation
aggfuncLe paramètre peut spécifier plusieurs méthodes d’agrégation pour analyser les données.
Exemple
import numpy as np
# 1. Créer des données de ventes plus riches (chaque produit a plusieurs enregistrements)
sales = pd.DataFrame({
'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
'region': ['North', 'North', 'South', 'South', 'East', 'East', 'West', 'West', 'North', 'South'],
'sales': [100, 150, 200, 180, 190, 200, 220, 230, 110, 190],
'quantity': [10, 15, 20, 18, 19, 20, 22, 23, 11, 19]
})
print("=== Données de ventes ===")
print(sales)
# 2. Calculer la moyenne des ventes (fonction d’agrégation par défaut)
print("n=== Ventes moyennes ===")
mean_result = sales.pivot_table(values='sales', index='product', columns='region', aggfunc='mean')
print(mean_result.round(1))
# 3. Utiliser plusieurs fonctions d'agrégation simultanément (passer un dictionnaire)
print("n=== Fonctions d'agrégation multiples ===")
multi_agg = sales.pivot_table(
values='sales',
index='product',
columns='region',
aggfunc={'sales': ['sum', 'mean', 'max']}
)
print(multi_agg)
# 4. Différentes colonnes utilisent différentes fonctions d'agrégation
print("n=== Différentes colonnes, différentes agrégations ===")
diff_agg = sales.pivot_table(
values=['sales', 'quantity'],
index='product',
columns='region',
aggfunc={'sales': 'sum', 'quantity': 'mean'}
)
print(diff_agg)
Sortie attendue :
=== 销售数据 ===
product region sales quantity
0 A North 100 10
1 B North 150 15
2 A South 200 20
3 B South 180 18
4 A East 190 19
5 B East 200 20
6 A West 220 22
7 B West 230 23
8 A North 110 11
9 B South 190 19
=== 销售额平均值 ===
region East North South West
product
A 190.0 105.0 200.0 220.0
B 200.0 150.0 185.0 230.0
=== 多聚合函数 ===
sales
sum mean max
region East North South West East North South West East North South West
product
A 190 210 200 220 190 105 200 220 190 110 200 220
B 200 150 370 230 200 150 185 230 200 150 190 230
=== 不同列不同聚合 ===
sales quantity
region East North South West East North South West
product
A 190 210 200 220 19.0 10.5 20.0 22.0
B 200 150 370 230 20.0 15.0 18.5 23.0
Explication du code :
aggfuncPeut être une chaîne unique (telle que 'sum', 'mean'), ou une liste ou un dictionnaire.- Lorsqu'on passe un dictionnaire, différentes fonctions d'agrégation peuvent être spécifiées pour différentes colonnes.
- La moyenne des ventes du produit A dans la région Nord est de 105 ((100+110)/2), ce qui démontre la capacité de pivot_table() à gérer automatiquement les valeurs dupliquées.
Exemple 3 : Utilisation de margins pour ajouter des totaux
Utilisermarginsle paramètre peut ajouter des totaux de lignes et de colonnes, ce qui facilite la visualisation des données de synthèse.
Exemple
# 1. Créer des données de ventes
sales = pd.DataFrame({
'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
'region': ['North', 'North', 'South', 'South', 'East', 'East', 'West', 'West'],
'sales': [100, 150, 200, 180, 190, 200, 220, 230]
})
# 2. Tableau croisé dynamique sans totaux
print("=== No Totals ===")
no_margins = sales.pivot_table(values='sales', index='product', columns='region', aggfunc='sum')
print(no_margins)
# 3. Ajouter les totaux de lignes et de colonnes
print("n=== Ajouter des totaux (margins=True) ===")
with_margins = sales.pivot_table(
values='sales',
index='product',
columns='region',
aggfunc='sum',
margins=True
)
print(with_margins)
# 4. Nom du total personnalisé
print("n=== Nom du total personnalisé ===")
custom_name = sales.pivot_table(
values='sales',
index='product',
columns='region',
aggfunc='sum',
margins=True,
margins_name='Total'
)
print(custom_name)
# 5. Tableau croisé dynamique avec index de lignes à plusieurs niveaux
print("n=== Index de lignes à plusieurs niveaux ===")
multi_index = sales.pivot_table(
values='sales',
index=['product', 'region'],
aggfunc='sum'
)
print(multi_index)
Sortie attendue :
=== 无合计 === region East North South West product A 190 100 200 220 B 200 150 180 230 === 添加合计 (margins=True) === region East North South West All product A 190 100 200 220 710 B 200 150 180 230 760 All 390 250 380 450 1470 === 自定义合计名称 === region East North South West 总计 product A 190 100 200 220 710 B 200 150 180 230 760 总计 390 250 380 450 1470
Explication du code :
margins=TrueAjoute une ligne "All" (total) en bas et une colonne "All" (total) à droite du tableau croisé dynamique.- Vous pouvez utiliser
margins_namele paramètre pour personnaliser le nom des totaux, tel que 'Total'. - La colonne All affiche le total des ventes de chaque produit toutes régions confondues, la ligne All affiche le total des ventes de tous les produits dans chaque région, et le coin inférieur droit est le total général de toutes les données.
Exemple 4 : Utilisation de fill_value pour gérer les valeurs manquantes
Utiliserfill_valuele paramètre peut remplir les valeurs manquantes générées après le pivotage.
Exemple
import numpy as np
# 1. Créer des données (certaines combinaisons produit-région n'existent pas)
sales = pd.DataFrame({
'product': ['A', 'B', 'A', 'B'],
'region': ['North', 'North', 'South', 'South'],
'sales': [100, 150, 200, 180]
})
print("=== Données originales ===")
print(sales)
# 2. Ne pas remplir les valeurs manquantes (par défaut)
print("n=== Valeurs manquantes non remplies ===")
no_fill = sales.pivot_table(values='sales', index='product', columns='region')
print(no_fill)
# 3. Remplir les valeurs manquantes avec 0
print("n=== Remplir les valeurs manquantes avec 0 ===")
fill_zero = sales.pivot_table(
values='sales',
index='product',
columns='region',
fill_value=0
)
print(fill_zero)
# 4. Démontrer l'agrégation automatique des valeurs dupliquées
data_with_duplicates = pd.DataFrame({
'product': ['A', 'A', 'B', 'B', 'A'],
'region': ['North', 'North', 'South', 'South', 'North'],
'sales': [100, 120, 200, 180, 90]
})
print("n=== Données sur les valeurs en double ===")
print(data_with_duplicates)
print("n=== Agrégation automatique (pivot lève une erreur, pivot_table effectue automatiquement la somme) ===")
auto_agg = data_with_duplicates.pivot_table(
values='sales',
index='product',
columns='region',
aggfunc='sum'
)
print(auto_agg)
Sortie attendue :
=== 原始数据 === product region sales 0 A North 100 1 B North 150 2 A South 200 3 B South 180 === 不填充缺失值 === region North South product A 100.0 200.0 B 150.0 180.0 === 填充缺失值为0 === region North South product A 100 200 B 150 180 === 重复值数据 === product region sales 0 A North 100 1 A North 120 2 B South 200 3 B South 180 4 A North 90 === 自动聚合(pivot会报错,pivot_table自动求和)=== region North South product A 310 NaN B NaN 380
Explication du code :
fill_value=0Les valeurs manquantes peuvent être remplies par 0 pour faciliter les calculs ultérieurs.- Lorsqu'il y a des combinaisons produit-région en double,
pivot_table()utilise automatiquementaggfuncpour l'agrégation, tandis quepivot()lève une erreur. - Le total des ventes du produit A dans la région Nord est de 310 (100+120+90), ce qui est le résultat d'une addition automatique.
Notes
Remarques importantes :
pivot_table()etpivot()La principale différence réside dans le traitement des valeurs en double : pivot_table agrège automatiquement, tandis que pivot lève une erreur.- Quand
valuesLorsque le paramètre n'est pas spécifié, toutes les colonnes numériques seront agrégées.marginsLe total des lignes/colonnes ajoutées par le paramètre peut affecter le traitement ultérieur des données ; à utiliser avec prudence.- Lors du traitement de données à grande échelle, pivot_table peut consommer beaucoup de mémoire ; faites attention au contrôle du volume de données.
Autres extensions
Fonctions courantes de Pandas