Fonction pd.melt() de Pandas

Pandas 常用函数Fonctions courantes de Pandas


pd.melt()est une fonction de premier niveau de la bibliothèque Pandas, utilisée pourconvertir un tableau large en tableau longElle « fond » les données au format large contenant plusieurs colonnes en format long, de manière similaire à l'opération unpivot dans Excel.

C'est l'une des fonctions les plus couramment utilisées pour la restructuration de données, particulièrement utile lorsqu'il faut convertir les données au format long avant la visualisation des données, ou lorsqu'il faut combiner plusieurs colonnes en une seule colonne.

Définition du mot: meltCela signifie « fondre, fusionner » ; ici, cela désigne le fait de « faire fondre » la structure de tableau large en une structure de tableau long, de manière similaire au fait de regrouper plusieurs colonnes de données.


Syntaxe de base et paramètres

pd.melt()est une fonction de premier niveau de la bibliothèque Pandas, utilisée pour convertir des données au format large en format long.

Format de syntaxe

pd.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)

Description du paramètre

  • Paramètre: frame
    • Type : DataFrame.
    • Description :Paramètre obligatoire. Le DataFrame de données source, c'est-à-dire les données à convertir du format large au format long.
  • Paramètre: id_vars
    • Type : nom de colonne, liste de tuples ou None.
    • Description : colonnes utilisées comme variables d'identification (ID), ces colonnes restent inchangées après la conversion. Il peut s'agir d'un seul nom de colonne ou d'une liste de noms de colonnes. Si ce n'est pas spécifié, toutes les colonnes seront traitées comme value_vars.
  • Paramètre: value_vars
    • Type : nom de colonne, liste de tuples ou None.
    • Description : les colonnes à « fondre », c'est-à-dire les colonnes qui sont converties en lignes. Si ce n'est pas spécifié, toutes les colonnes sauf id_vars seront converties.
  • Paramètre: var_name
    • Type : chaîne de caractères ou None.
    • Description : le nom de la nouvelle colonne généré pour stocker les noms des colonnes d'origine. La valeur par défaut est 'variable'.
  • Paramètre: value_name
    • Type : string.
    • Description : Le nom de la colonne de valeurs générée. Par défaut, 'value'.
  • Paramètre: col_level
    • Type : int, str ou None.
    • Description : Si les colonnes sont un MultiIndex, spécifiez le niveau à fondre.

Description de la fonction

  • Valeur de retour: Renvoie un DataFrame, avec les données converties du format large au format long.
  • Effet: Transforme les valeurs de plusieurs colonnes en deux colonnes : une colonne stocke les noms des colonnes d'origine (variable), et une colonne stocke les valeurs correspondantes (value).

Exemples

Maîtrisons à fond, à travers une série d'exemples du plus simple au plus complexe,pd.melt()l'utilisation de.

Exemple 1 : Utilisation de base - Convertir un tableau large simple en tableau long

Exemples

import pandas as pd

# 1. Créer des données au format large (une colonne pour chaque trimestre)
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'Q1_sales': [100, 150, 200],
    'Q2_sales': [120, 160, 210],
    'Q3_sales': [130, 170, 220]
})

print("=== Données d'origine au format large ===")
print(df)

# 2. Utiliser pd.melt() pour convertir au format long
melted = pd.melt(df, id_vars=['name'], value_vars=['Q1_sales', 'Q2_sales', 'Q3_sales'])
print("\n=== pd.melt() converti au format long ===")
print(melted)

# 3. Noms de colonnes personnalisés
melted_custom = pd.melt(
    df,
    id_vars=['name'],
    value_vars=['Q1_sales', 'Q2_sales', 'Q3_sales'],
    var_name='quarter',
    value_name='sales'
)
print("\n=== Noms de colonnes personnalisés ===")
print(melted_custom)

Sortie attendue :

=== 原始宽格式数据 ===
      name  Q1_sales  Q2_sales  Q3_sales
0    Alice      100      120      130
1     Bob      150      160      170
2  Charlie      200      210      220

=== pd.melt() 转换为长格式 ===
      name    variable  value
0    Alice   Q1_sales    100
1     Bob   Q1_sales    150
2  Charlie  Q1_sales    200
3    Alice   Q2_sales    120
4     Bob   Q2_sales    160
5  Charlie  Q2_sales    210
6    Alice   Q3_sales    130
7     Bob   Q3_sales    170
8  Charlie  Q3_sales    220

=== 自定义列名 ===
      name  quarter  sales
0    Alice  Q1_sales    100
1     Bob  Q1_sales    150
2  Charlie  Q1_sales    200
3    Alice  Q2_sales    200

Analyse du code :

  1. Les données d'origine sont au format large, chaque ligne correspond à une personne, et Q1, Q2, Q3 sont des colonnes de données de ventes pour trois trimestres.
  2. id_vars=['name']Spécifiez la colonne de nom à conserver telle quelle comme identifiant.
  3. value_vars=['Q1_sales', 'Q2_sales', 'Q3_sales']Spécifiez les colonnes à fondre.
  4. Le résultat ajoute une colonne variable (stockant les noms de colonnes d'origine) et une colonne valeur (stockant les valeurs correspondantes).
  5. Utilisationvar_nameetvalue_namepeut personnaliser les noms des nouvelles colonnes.

Exemple 2 : sans spécifier value_vars - Fondre toutes les colonnes sauf id_vars

Lorsque value_vars n'est pas spécifié, toutes les colonnes sauf id_vars sont automatiquement fondues.

Exemples

import pandas as pd

# 1. Créer des données avec plus de colonnes
df = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie'],
    'math': [90, 85, 92],
    'english': [88, 90, 87],
    'science': [95, 88, 91]
})

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

# 2. Spécifier uniquement id_vars, fondre automatiquement toutes les autres colonnes
melted = pd.melt(df, id_vars=['id', 'name'])
print("\n=== Melt toutes les colonnes non-id ===")
print(melted)

# 3. Cas avec plusieurs id_vars
print("\n=== Plusieurs id_vars ===")
melted_multi = pd.melt(df, id_vars=['name'], value_vars=['math', 'english', 'science'])
print(melted_multi)

# 4. Utiliser un seul id_vars
print("\n=== Un seul id_vars ===")
melted_one = pd.melt(df, id_vars=['id'])
print(melted_one)

Sortie attendue :

=== 原始数据 ===
   id     name  math  english  science
0   1    Alice     90      88      95
1   2     Bob     85      90      88
2   3  Charlie    92      87      91

=== 融化所有非id列 ===
   id     name   variable  value
0   1    Alice      math     90
1   2       Bob     math     85
2   3  Charlie    math     92
3   1    Alice   english     88
4   2       融化为两列(variable 和 value)。

- 不指定 value_vars 时,系统会自动识别并熔化除 id_vars 外的所有列
- id_vars 可以是单个列或多个列的组合

Analyse du code :

  • Lorsque non spécifié,value_varsil effectuera automatiquement le meltid_varstoutes les colonnes sauf id_vars.
  • Lorsque seul id_vars est spécifié et que value_vars ne l'est pas, chaque ligne de données produit autant de nouvelles lignes qu'il y a de value_vars.
  • Cette méthode est très pratique lorsque vous devez traiter uniformément des données multi-colonnes.

Exemple 3 : Sans id_vars - Melt de toutes les colonnes

Lorsque id_vars n'est pas spécifié, l'index des données d'origine sert d'identifiant.

Exemples

import pandas as pd

# 1. Créer des données (sans colonne id explicite)
df = pd.DataFrame({
    'Q1': [100, 150, 200],
    'Q2': [120, 160, 210],
    'Q3': [130, 170, 220]
})

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

# 2. Ne pas spécifier id_vars, utiliser l'index par défaut
melted = pd.melt(df)
print("\n=== Sans spécifier id_vars ===")
print(melted)

# 3. Restaurer l'index d'origine
print("\n=== Réinitialiser l'index ===")
melted_with_index = pd.melt(df, ignore_index=False)
print(melted_with_index)

# 4. Cas pratique : créer un identifiant
df_with_id = pd.DataFrame({
    'year': [2023, 2023, 2023],
    'Q1': [100, 150, 200],
    'Q2': [120, 160, 210]
})
print("\n=== Données d'origine (avec année) ===")
print(df_with_id)

# Ajouter d'abord l'année à id_vars
melted_year = pd.melt(df_with_id, id_vars=['year'])
print("\n=== Résultat du melt incluant l'année ===")
print(melted_year)

Sortie attendue :

=== 原始数据 ===
     Q1   Q2   Q3
0  100  120  130
1  150  160  170
2  200  210  220

=== 不指定 id_vars ===
   variable  value
0        Q1    100
1        Q1    150
2        融化所有列,将原始列名转为 variable 列的值,原始值转为 value 列。

Analyse du code :

  • Lorsque id_vars n'est pas spécifié, seules les colonnes variable et value restent.
  • Utilisationignore_index=Falsepeut conserver l'index d'origine, ce qui facilite la comparaison ultérieure avec les données d'origine.
  • En pratique, un ou plusieurs id_vars sont généralement spécifiés pour conserver les informations clés.

Exemple 4 : Cas pratique - Préparation à la visualisation de données

melt() est un excellent assistant pour la visualisation de données ; de nombreuses bibliothèques de graphiques (telles que Seaborn, Matplotlib) gèrent mieux les données au format long.

Exemples

import pandas as pd

# 1. Créer des données de ventes (une colonne par région)
sales = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D'],
    'Jan': [1200, 1500, 900, 1100],
    'Feb': [1350, 1600, 950, 1200],
    'Mar': [1100, 1450, 880, 1050]
})

print("=== Données de ventes au format large ===")
print(sales)

# 2. Passer au format long (pour la visualisation)
sales_long = pd.melt(
    sales,
    id_vars=['product'],
    var_name='month',
    value_name='sales'
)

print("\n=== Données de ventes au format long ===")
print(sales_long)

# 3. Exemple de traitement de données : calculer l'évolution d'une année sur l'autre
# Ajouter le numéro du mois
month_map = {'Jan': 1, 'Feb': 2, 'Mar': 3}
sales_long['month_num'] = sales_long['month'].map(month_map)

print("\n=== Ajouter le numéro du mois ===")
print(sales_long)

# 4. Filtrer les données pour un mois spécifique
feb_sales = sales_long[sales_long['month'] == 'Feb']
print("\n=== Données de ventes pour février ===")
print(feb_sales)

Sortie attendue :

=== 宽格式销售数据 ===
  product   Jan   Feb   Mar
0       A  1200  1350  1100
product  Jan  180  170   6

=== 长格式销售数据(用于可视化) ===
   product month  sales
0       A   Jan  1200
1       B   Jan  1500
2       C   Jan   900
3       D   Jan  1100
4       A   Feb  1350

Analyse du code :

  • Les données au format large ont une colonne par région/point temporel, ce qui facilite l'affichage et la saisie des données.
  • Les données au format long ont une ligne par observation, ce qui est le format standard pour l'analyse statistique.
  • Les bibliothèques de visualisation telles que Seaborn acceptent les données au format long, ce qui facilite la création de diagrammes à barres groupées, de graphiques en courbes, etc.
  • Utilisationid_varspeut empêcher des variables catégorielles telles que produit et région d'être fondues.

Exemple 5 : Fusion avec un index de colonnes à plusieurs niveaux

Lorsqu'un DataFrame a un index de colonnes à plusieurs niveaux, vous pouvez utilisercol_levelle paramètre.

Exemples

import pandas as pd

# 1. Créer des données avec un index de colonnes à plusieurs niveaux
df = pd.DataFrame(
    [[100, 110, 200, 210], [150, 160, 180, 190]],
    index=['Store_A', 'Store_B'],
    columns=pd.MultiIndex.from_tuples([
        ('Electronics', 'Q1'), ('Electronics', 'Q2'),
        ('Furniture', 'Q1'), ('Furniture', 'Q2')
    ], names=['Category', 'Quarter'])
)

print("=== Données d'origine (index de colonnes multi-niveaux) ===")
print(df)

# 2. Melt toutes les colonnes (sans spécifier de niveau)
print("\n=== Melt toutes les colonnes ===")
melted_all = pd.melt(df, ignore_index=False)
print(melted_all)

# 3. Melt uniquement le niveau interne (Quarter)
print("\n=== Dépivoter uniquement le niveau Quarter ===")
melted_quarter = pd.melt(df, col_level=1)
print(melted_quarter)

# 4. Dépivoter le niveau externe (Category)
print(n=== Dépivoter uniquement le niveau Category ===)
melted_category = pd.melt(df, col_level=0)
print(melted_category)

Sortie attendue :

=== 原始数据(多层列索引)===
Category      Electronics   Furniture
Quarter              Q1   Q2      Q1   融化不同层级会产生不同的结果:
- 融化内层(Quarter)保留 Category 作为 id
- 融化外层(Category)保留 Quarter 作为 id

Explication du code :

  • Pour un DataFrame avec un index de colonnes à plusieurs niveaux, les noms de colonnes se présentent sous forme de tuples : (Category, Quarter).
  • col_level=0Dépivoter le niveau externe (Category), conserver Quarter comme identifiant.
  • col_level=1Dépivoter le niveau interne (Quarter), conserver Category comme identifiant.
  • Cette flexibilité vous permet de choisir le niveau à dépivoter en fonction de vos besoins d'analyse.

Astuce : pd.melt()C'est un excellent outil d'aide pour la visualisation de données. La plupart des bibliothèques de traçage (par exemple, Seaborn, Plotnine) sont plus performantes pour gérer les données au format long ; utiliser melt() pour transformer les données avant le traçage est une pratique courante.

Pandas 常用函数Fonctions Pandas courantes

Autres extensions