Fonction DataFrame.pivot_table() de Pandas

Pandas 常用函数Fonctions courantes 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

import pandas as pd

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

  1. Les données d'origine sont au format long, chaque ligne enregistrant les ventes d'un produit dans une certaine région.
  2. pivot_table()Utilise product comme index de ligne, region comme index de colonne, et sales comme valeurs.
  3. Utiliseraggfunc='sum'pour faire la somme et résumer les ventes.
  4. 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 pandas as pd
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

import pandas as pd

# 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 utilisermargins_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 pandas as pd
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.
  • QuandvaluesLorsque 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.

Pandas 常用函数Fonctions courantes de Pandas

Autres extensions