Fonction df.unstack() de Pandas

Pandas 常用函数Fonctions courantes de Pandas


df.unstack()est une méthode membre de DataFrame, utilisée pourconvertir les index de lignes en index de colonnes. Elle « déballe » les données avec une indexation hiérarchique, en déplaçant un ou plusieurs niveaux de l'index de lignes vers les colonnes.

Il s'agit d'une opération importante pour le remodelage des données, généralement utilisée conjointement avecstack()pour réaliser la conversion mutuelle des données.

Définition du mot: unstackCela signifie « déballer, déplier » ; ici, cela fait référence au « dépliage » de l'index de lignes en colonnes, convertissant une table longue en une table large.


Syntaxe de base et paramètres

df.unstack()C'est une méthode d'instance de DataFrame, appelée via l'opérateur point.

Format de syntaxe

DataFrame.unstack(level=-1, fill_value=None)

Description du paramètre

  • Paramètre: level
    • Type : int, str, liste d'int, ou liste de str.
    • Description : Spécifie le niveau à dépiler en colonnes. Pour un index à plusieurs niveaux, vous pouvez spécifier un numéro de niveau spécifique (à partir de 0) ou un nom de niveau. La valeur par défaut est -1, ce qui signifie le niveau le plus interne.
  • Paramètre: fill_value
    • Type : scalaire ou None.
    • Description : La valeur utilisée pour remplir les valeurs manquantes générées par l'opération de dépilage. La valeur par défaut est None, en conservant NaN.

Description de la fonction

  • Valeur de retour: Renvoie une Series ou un DataFrame. Si un seul niveau de ligne du DataFrame d'origine est dépilé, elle renvoie une Series ; sinon, elle renvoie un DataFrame.
  • Effet: Déplace un ou plusieurs niveaux de l'index de ligne vers l'index de colonne, produisant un format de données plus large. Les données désempilées sont au « format large », ce qui facilite leur visualisation et leur comparaison.

Exemples

À travers une série d'exemples du simple au complexe, maîtrisons à fonddf.unstack()son utilisation.

Exemple 1 : Utilisation de base - Conversion de lignes en colonnes

Exemple

import pandas as pd

# 1. Créer des données au format long
df = pd.DataFrame({
    'product': ['A', 'A', 'B', 'B', 'C', 'C'],
    'region': ['North', 'South', 'North', 'South', 'North', 'South'],
    'sales': [100, 150, 200, 180, 220, 250]
})

print("=== Données originales au format long ===")
print(df)

# 2. Configurer un index hiérarchique
df_indexed = df.set_index(['product', 'region'])
print("n=== Après avoir configuré l'index hiérarchique ===")
print(df_indexed)

# 3. Utiliser df.unstack() pour convertir l'index interne en colonnes
unstacked = df_indexed.unstack()
print("n=== Résultat de df.unstack() ===")
print(unstacked)

# 4. Vue simplifiée
print("n=== Ventes uniquement ===")
print(unstacked['sales'])

Sortie attendue :

=== 原始长格式数据 ===
  product region  sales
0       A  North    100
1       A  South    150
2       B  North    200
3       B  South    180
4       C  North    220
5       C  South    250
n=== 设置层次化索引后 ===
                sales
product region       
A       North     100
        South     150
B       North     200
        South     180
C       North     220
        South     250
n=== df.unstack() 结果 ===
        sales      
region  North South
product            
A         100   150
B         200   180
C         220   250
n=== 只看销售额 ===
region   North  South
product              
A          100    150
B          200    180
C          220    250

Explication du code :

  1. Les données d'origine sont au format long, où chaque ligne enregistre le montant des ventes d'un produit dans une région.
  2. Utiliserset_index()pour créer un index hiérarchique (produit comme niveau externe, région comme niveau interne).
  3. unstack()Le niveau d'index interne région est déplacé vers la position de colonne.
  4. Le résultat est au format large, permettant une comparaison intuitive des données de ventes entre différents produits et régions.

Exemple 2 : désempilement d'un index à plusieurs niveaux

Lorsqu'un DataFrame a un index de lignes à plusieurs niveaux, vous pouvez spécifier le niveau à désempiler.

Exemple

import pandas as pd

# 1. Créer des données avec un index de lignes à plusieurs niveaux
df = pd.DataFrame({
    'year': [2023, 2023, 2023, 2023, 2024, 2024, 2024, 2024],
    'quarter': ['Q1', 'Q1', 'Q2', 'Q2', 'Q1', 'Q1', 'Q2', 'Q2'],
    'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
    'sales': [100, 150, 200, 180, 220, 250, 230, 270]
})

print("=== Données originales ===")
print(df)

# 2. Configurer l'index à plusieurs niveaux
df_indexed = df.set_index(['year', 'quarter', 'product'])
print("n=== Après avoir configuré l'index à plusieurs niveaux ===")
print(df_indexed)

# 3. Dépiler le niveau le plus interne (product, level=-1 par défaut)
print("n=== Niveau product dépilé (par défaut) ===")
unstacked_inner = df_indexed.unstack()
print(unstacked_inner['sales'])

# 4. Dépiler le niveau intermédiaire (quarter)
print("n=== Niveau quarter dépilé ===")
unstacked_quarter = df_indexed.unstack(level='quarter')
print(unstacked_quarter['sales'])

# 5. Dépiler le niveau extérieur (year)
print("n=== Niveau year dépilé ===")
unstacked_year = df_indexed.unstack(level='year')
print(unstacked_year['sales'])

# 6. Désempiler plusieurs niveaux en même temps
print("n=== Année et produit désempilés ensemble ===")
unstacked_multi = df_indexed.unstack(level=['year', 'product'])
print(unstacked_multi['sales'])

Sortie attendue :

=== 原始数据 ===
   year quarter product  sales
0  2023      Q1       A    100
1  2023      Q1       B    150
2  2023      Q2       A    200
3  2023      Q2       B    180
4  2024      Q1       A    220
5  2024      Q1       B    250
6  2024      Q2       A    230
7  2024      Q2       B    270
n=== 设置多层索引 ===
                      sales
year quarter product       
2023 Q1      A          100
             B          150
     Q2      A          200
             B          180
2024 Q1      A          220
             B          250
     Q2      A          230
             B          270
n=== 展开 product 层(默认)===
product         A    B
year quarter          
2023 Q1       100  150
     Q2       200  180
2024 Q1       220  250
     Q2       230  270
n=== 展开 quarter 层 ===
quarter        Q1   Q2
year product          
2023 A        100  200
     B        150  180
2024 A        220  230
     B        250  270
n=== 展开 year 层 ===
year             2023  2024
quarter product            
Q1      A         100   220
        B         150   250
Q2      A         200   230
        B         180   270
n=== 同时展开 year 和 product ===
year    2023      2024     
product    A    B    A    B
quarter                    
Q1       100  150  220  250
Q2       200  180  230  270

Explication du code :

  • Pour un DataFrame avec un index à plusieurs niveaux, vous pouvez utiliser lelevelparamètre pour spécifier quel niveau désempiler.
  • Par défaut,level=-1le niveau le plus interne (produit) est désempilé.
  • Le désempilement de différents niveaux produit différentes dispositions des données, ce qui facilite l'analyse des données sous différents angles.

Exemple 3 : Gestion des valeurs manquantes avec fill_value

Utilisez lafill_valueparamètre pour remplir les valeurs manquantes générées après le désempilement.

Exemple

import pandas as pd
import numpy as np

# 1. Créer des données incomplètes (les combinaisons produit-région n'ont pas toutes des données)
df = pd.DataFrame({
    'product': ['A', 'A', 'B', 'C'],
    'region': ['North', 'South', 'North', 'Est'],
    'sales': [100, 150, 200, 220]
})

print("=== Données originales (incomplètes) ===")
print(df)

# 2. Créer un index hiérarchique et unstack
df_indexed = df.set_index(['product', 'region'])
print("n=== Index hiérarchique ===")
print(df_indexed)

# 3. Ne pas remplir les valeurs manquantes
print("n=== Sans remplir les valeurs manquantes ===")
unstacked = df_indexed.unstack()
print(unstacked)
print(f"Nombre de valeurs manquantes : {unstacked['sales'].isna().sum().sum()}")

# 4. Utiliser fill_value=0 pour remplir les valeurs manquantes
print("n=== fill_value=0 ===")
unstacked_fill = df_indexed.unstack(fill_value=0)
print(unstacked_fill)
print(f"Nombre de valeurs manquantes : {unstacked_fill['sales'].isna().sum().sum()}")

Sortie attendue :

=== 原始数据(不完整)===
  product region  sales
0       A  North    100
1       A  South    150
2       B  North    200
3       C   East    220
n=== 层次化索引 ===
                sales
product region       
A       North     100
        South     150
B       North     200
C       East      220
n=== 不填充缺失值 ===
         sales              
region    East  North  South
product                     
A          NaN  100.0  150.0
B          NaN  200.0    NaN
C        220.0    NaN    NaN
缺失值数量: 5
n=== fill_value=0 ===
        sales            
region   East North South
product                  
A           0   100   150
B           0   200     0
C         220     0     0
缺失值数量: 0

Explication du code :

  • Lorsque les données d'origine sont incomplètes, unstack produit des valeurs manquantes (NaN).
  • En utilisant lafill_valueparamètre, vous pouvez spécifier une valeur de remplissage pour éviter des erreurs dans les calculs ultérieurs.
  • Il est généralement rempli de 0 pour indiquer "pas de données" ou "cette combinaison n'existe pas".

Exemple 4 : Combiner unstack et stack

unstack()etstack()Ce sont des opérations inverses ; les utiliser ensemble permet une restructuration flexible des données.

Exemple

import pandas as pd

# 1. Créer des données initiales au format large
df = pd.DataFrame({
    'product': ['A', 'B', 'C'],
    'Nord': [100, 150, 200],
    'South': [180, 170, 160],
    'Est': [190, 200, 210]
})

print("=== Données originales au format large ===")
print(df)

# 2. Utiliser d'abord stack pour convertir au format long
print("n=== étape 1 : stack convertit au format long ===")
stacked = df.set_index('product').stack()
print(stacked)

# 3. Puis unstack pour revenir en arrière (vérifier la réversibilité)
print("n=== étape 2 : unstack reconvertit au format large ===")
restored = stacked.unstack()
print(restored)

# 4. En pratique : réorganiser les données
print("n=== Pratique : déplacer la région vers les colonnes ===")
# Original : produit comme index de ligne, région comme colonnes
# Cible : région comme index de ligne, produit comme colonnes
result = df.set_index('product').unstack().unstack(level=-1)
print(result)

# 5. Utiliser reorder_levels pour ajuster l'ordre des niveaux
print("n=== Utilisation de reorder_levels pour ajuster les niveaux ===")
# Créer un index à deux niveaux
df_multi = pd.DataFrame(
    [[100, 200], [150, 180], [190, 210]],
    index=pd.MultiIndex.from_tuples([
        ('A', 'North'), ('B', 'North'), ('C', 'North')
    ], names=['product', 'region']),
    columns=['2023', '2024']
)
print("Données d'origine :")
print(df_multi)

# Ajuster l'ordre des niveaux
print("nAprès ajustement (année au niveau externe):")
print(df_multi.unstack(level='region'))

Sortie attendue :

=== 原始宽格式数据 ===
  product  North  South  East
0       A    100    180   190
1        B    150    170 
...

Explication du code :

  • stack()etunstack()Ce sont une paire d'opérations inverses.
  • Appliquer d'abord stack puis unstack peut théoriquement restaurer la forme d'origine (en ignorant les différences de valeurs de remplissage).
  • Différentes dispositions de données peuvent être obtenues grâce à différentes combinaisons de niveaux.
  • Dans l'analyse de données réelle, il est souvent nécessaire d'ajuster de manière répétée la forme des données pour répondre à différents besoins d'analyse.

Astuce : unstack()etstack()C'est un outil essentiel pour la restructuration des données.unstack()Il « dépile » les lignes en colonnes (du format long au format large),stack()Il « empile » les colonnes en lignes (du format large au format long).

Pandas 常用函数Fonctions courantes de Pandas

Autres extensions