Fonction pd.melt() 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
# 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 :
- 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.
id_vars=['name']Spécifiez la colonne de nom à conserver telle quelle comme identifiant.value_vars=['Q1_sales', 'Q2_sales', 'Q3_sales']Spécifiez les colonnes à fondre.- Le résultat ajoute une colonne variable (stockant les noms de colonnes d'origine) et une colonne valeur (stockant les valeurs correspondantes).
- Utilisation
var_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
# 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
# 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.
- Utilisation
ignore_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
# 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.
- Utilisation
id_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
# 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.
Autres extensionsAstuce :
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.
Fonctions courantes de Pandas