Fonction Pandas pd.pivot_table()
pd.pivot_table()est une fonction de la bibliothèque Pandas utilisée pourcréer des tableaux croisés dynamiques. Un tableau croisé dynamique est une fonctionnalité courante des tableurs qui peut regrouper, agréger et remodeler des données, ce qui facilite l’analyse des données sous différents angles.
etpd.crosstab()Comparé àpivot_table(), il est plus puissant, prend en charge plusieurs fonctions d’agrégation, gère les valeurs manquantes et un remodelage de données plus complexe.
Définition du mot: pivot_tablesignifie « tableau croisé dynamique », qui est un tableau pouvant modifier dynamiquement la disposition des données et résumer et analyser les données selon plusieurs dimensions.
Syntaxe de base et paramètres
pd.pivot_table()est une fonction de haut niveau de la bibliothèque Pandas, utilisée pour créer des tableaux croisés dynamiques.
Format de syntaxe
pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
Description des paramètres
- Paramètre:
data- Type : DataFrame.
- Description : DataFrame des données source.
- Paramètre:
values- Type : nom de colonne ou liste de noms de colonnes.
- Description : la colonne à agréger. Si elle n’est pas spécifiée, toutes les colonnes numériques seront agrégées.
- Paramètre:
index- Type : nom de colonne, liste de noms de colonnes ou fonction.
- Description : la colonne utilisée comme index de ligne. 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 liste de noms de colonnes.
- Description : la colonne utilisée comme index de colonne.
- Paramètre:
aggfunc- Type : fonction, chaîne ou liste de fonctions.
- Description : fonction d'agrégation. Les valeurs courantes incluent 'sum', 'mean', 'count', 'min', 'max', 'median', 'std', etc. La valeur par défaut est 'mean'.
- Paramètre:
fill_value- Type : scalaire ou None.
- Description : la valeur utilisée pour remplir les valeurs manquantes.
- Paramètre:
margins- Type : booléen.
- Description : indique s'il faut ajouter les totaux de lignes et de colonnes. La valeur par défaut est
False。
Description de la fonction
- Valeur de retour: renvoie un DataFrame, c'est-à-dire le tableau croisé dynamique.
- Effet: remodeler et résumer les données selon les lignes, colonnes et fonction d'agrégation spécifiées.
Exemples
Maîtrisons parfaitement l'utilisation depd.pivot_table()à travers une série d'exemples du simple au complexe.
Exemple 1 : Utilisation de base - Créer un tableau croisé dynamique simple
Exemple
import numpy as np
# 1. Créer des données de ventes
sales = pd.DataFrame({
'date': pd.date_range('2023-01-01', periods=12, freq='D'),
'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 région
pivot = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum')
print("n=== pd.pivot_table() Tableau croisé dynamique des ventes ===")
print(pivot)
# 3. Utiliser fill_value pour remplir les valeurs manquantes
print("n=== Remplir les valeurs manquantes (fill_value=0) ===")
pivot_fill = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum', fill_value=0)
print(pivot_fill)
Sortie attendue :
=== 销售数据 ===
date product region sales
0 2023-01-01 A North 100
1 2023-01-01 B North 150
2 2023-01-01 C North 200
3 2023-01-01 A South 180
4 2023-01-01 B South 170
5 2023-01-01 C South 160
6 2023-01-01 A East 190
7 2023-01-01 B East 200
8 2023-01-01 C East 210
9 2023-01-01 A West 220
10 2023-01-01 B West 230
11 2023-01-01 C West 240
=== pd.pivot_table() 销售透视表 ===
region East North South West
product
A 400.0 100.0 180.0 220.0
B 400.0 150.0 170.0 230.0
C 410.0 200.0 160.0 240.0
=== 填充缺失值 (fill_value=0) ===
region East North South West
product
A 400 100 180 220
B 400 150 170 230
C 410 200 160 240
Explication du code :
- Le tableau croisé dynamique résume les ventes par produit (ligne) et région (colonne).
fill_value=0Affiche les combinaisons manquantes sous forme de 0 pour une lecture plus facile.
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
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. Résumer (sum)
print("n=== Somme des ventes ===")
sum_result = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum')
print(sum_result)
# 3. Calculer la moyenne des ventes
print("n=== Ventes moyennes ===")
mean_result = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='mean')
print(mean_result.round(1))
# 4. Calculer plusieurs statistiques à la fois (passer une liste)
print("n=== Calculer le nombre et la moyenne simultanément ===")
multi_agg = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc=['sum', 'mean'])
print(multi_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 210 200 220
B 200 150 370 230
=== 销售额平均值 ===
region East North South West
product
A 190 105.0 200 220
B 200 150.0 185 230
=== 同时计算数量和、均值 ===
sum mean
region East North South West East North South West
product
A 190 210 200 220 190 105.0 200 220
B 200 150 370 230 200 150.0 185.0 230
Explication du code :
- L'utilisation de différentes fonctions d'agrégation permet de calculer différents indicateurs statistiques.
- Lorsque plusieurs fonctions d'agrégation sont transmises en même temps, le tableau croisé dynamique crée des index de colonnes à plusieurs niveaux.
Exemple 3 : Utiliser margins pour ajouter des totaux
Utilisez lamarginsparamètre pour ajouter les totaux de lignes et de colonnes, ce qui facilite la consultation des données récapitulatives.
Exemple
# Utiliser les données de ventes précédentes
sales = pd.DataFrame({
'product': ['A', 'B', 'A', 'B', 'A', 'B'],
'region': ['North', 'North', 'South', 'South', 'East', 'East'],
'sales': [100, 150, 200, 180, 190, 200]
})
# 1. Aucun total
print("=== Aucun total ===")
print(pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum'))
# 2. Ajouter les totaux de ligne et de colonne
print("n=== Ajouter les totaux (margins=True) ===")
result = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum', margins=True)
print(result)
# 3. Nom personnalisé du total
print("n=== Nom personnalisé du total ===")
result_name = pd.pivot_table(sales, values='sales', index='product', columns='region', aggfunc='sum', margins=True, margins_name='Total')
print(result_name)
# 4. Totaux pour un index de lignes à plusieurs niveaux
print("n=== Index de lignes à plusieurs niveaux ===")
multi_index = pd.pivot_table(sales, values='sales', index=['product', 'region'], aggfunc='sum')
print(multi_index)
Sortie attendue :
=== 无合计 ===
region East North South
product
A 190 100 200
B 200 150 180
=== 添加合计 (margins=True) ===
region East North South All
product
A 190 100 200 490
B 200 150 180 530
All 390 250 380 1020
=== 自定义合计名称 ===
region East North South 总计
product
A 190 100 200 490
B 200 150 180 530
总计 390 250 380 1020
=== 多层行索引 ===
sales
product region
A East 190
North 100
South 200
B East 200
North 150
South 180
Explication du code :
margins=TrueAjoute des lignes et des colonnes « All », affichant les données du total général.margins_nameVous pouvez personnaliser le nom du total.
Exemple 4 : Indexation à plusieurs niveaux et pivotage complexe
Vous pouvez utiliser plusieurs colonnes pour créer un tableau croisé dynamique avec une indexation à plusieurs niveaux.
Exemple
# 1. Créer des données avec plusieurs variables catégorielles
data = pd.DataFrame({
'year': [2022, 2022, 2022, 2023, 2023, 2023],
'quarter': ['Q1', 'Q2', 'Q3', 'Q1', 'Q2', 'Q3'],
'product': ['A', 'A', 'B', 'B', 'A', 'B'],
'sales': [100, 150, 200, 220, 180, 250]
})
print("=== Données ===")
print(data)
# 2. Utiliser plusieurs colonnes comme index de ligne
print("n=== Pivot multi-année multi-trimestre ===")
pivot = pd.pivot_table(data, values='sales', index=['year', 'quarter'], columns='product', aggfunc='sum')
print(pivot)
# 3. Plusieurs colonnes comme index de colonne
print("n=== Pivotement croisé complexe ===")
pivot_multi = pd.pivot_table(data, values='sales', index='year', columns=['product', 'quarter'], aggfunc='sum')
print(pivot_multi)
# 4. Utiliser fill_value pour gérer les valeurs manquantes
print("n=== Remplir les valeurs manquantes ===")
pivot_fill = pd.pivot_table(data, values='sales', index=['year', 'quarter'], columns='product', aggfunc='sum', fill_value=0)
print(pivot_fill)
Sortie attendue :
=== 数据 === year quarter product sales 0 2022 Q1 A 100 1 2022 Q2 A 150 2 2022 Q3 B 200 3 2023 Q1 B 220 4 2023 Q2 A 180 5 2023 Q3 B 250 === 多年份多季度透视 === product A B year quarter 2022 Q1 100.0 NaN 2022 Q2 150.0 NaN 2022 Q3 NaN 200.0 2023 Q1 NaN 220.0 2023 Q2 180.0 NaN 2023 Q3 NaN 250.0 === 复杂交叉透视 === product A B quarter Q1 Q2 Q3 Q1 Q2 Q3 year 2022 100 150 200 NaN NaN NaN 2023 NaN 180 250 NaN NaN NaN === 填充缺失值 === product A B year quarter 2022 Q1 100 0 2022 Q2 150 0 2022 Q3 0 200 2023 Q1 0 220 2023 Q2 180 0 2023 Q3 0 250
Explication du code :
- L'indexation à plusieurs niveaux est obtenue en spécifiant
index=['year', 'quarter']sous forme de liste. fill_value=0Remplir les données manquantes uniformément avec 0 pour faciliter les calculs ultérieurs.
Autres extensionsAstuce :
pd.pivot_table()offre de puissantes fonctionnalités de pivotement des données. Si vous avez seulement besoin de compter la fréquence de deux variables catégorielles,pd.crosstab()peut être plus concis.pd.crosstab()Renvoie les effectifs, tandis quepivot_table()peut calculer plusieurs statistiques telles que la moyenne, la somme, l'écart type, etc.pd.crosstab()peut être considéré commepivot_table()Dansaggfunc='count'un cas particulier lorsque
Fonctions courantes de Pandas