Fonction Pandas pd.pivot_table()

Pandas 常用函数Fonctions courantes de Pandas


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 estFalse。

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 pandas as pd
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 pandas as pd
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

import pandas as pd

# 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

import pandas as pd

# 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écifiantindex=['year', 'quarter']sous forme de liste.
  • fill_value=0Remplir les données manquantes uniformément avec 0 pour faciliter les calculs ultérieurs.

Astuce : 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

Pandas 常用函数Fonctions courantes de Pandas

Autres extensions