Fonction df.unstack() 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
# 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 :
- Les données d'origine sont au format long, où chaque ligne enregistre le montant des ventes d'un produit dans une région.
- Utiliser
set_index()pour créer un index hiérarchique (produit comme niveau externe, région comme niveau interne). unstack()Le niveau d'index interne région est déplacé vers la position de colonne.- 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
# 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 le
levelparamè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 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 la
fill_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
# 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.
Autres extensionsAstuce :
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).
Fonctions courantes de Pandas