# Convert the DataFrame from wide format to long format
products_sales_2025_melted = products_sales_2025.melt(# Keep the Product and Category columns unchanged
id_vars=["Product","Category"],# Convert the month columns into rows
value_vars=["January","February","March","April","May","June"],# Name of the new column that stores the original column names
var_name="Month",# Name of the new column that stores the corresponding sales values
value_name="Sales")# Display the reshaped DataFrame
products_sales_2025_melted.head(10)提供:
この例では、January と February の列だけを melt し、残りの月の列は無視しています。
# Convert only the January and February columns into rows
product_sales_3month = products_sales_2025.melt(
id_vars="Product",
value_vars=["January","February",])
product_sales_3month.head(20)提供:
# Keep the Product and Category columns while melting the monthly sales
product_sales_cat = products_sales_2025.melt(
id_vars=["Product","Category"])
product_sales_cat.head()提供:
出力列名を変更する
既定では、出力列の名前は variable と value になります。var_name と value_name を使って、より分かりやすい名前に変更しましょう。
# Keep the Product and Category columns while melting the monthly sales# Rename Month and Sales columns
product_sales_cat = products_sales_2025.melt(
id_vars=["Product","Category"],
var_name="Month",
value_name="Sales")
product_sales_cat.head()提供:
# Keep the original row index after reshaping
product_sales_index = products_sales_2025.melt(
id_vars=["Product","Category"],
var_name="Month",
value_name="Sales",
ignore_index=False)
product_sales_index.head(10)提供:
ワイド形式は読みやすい一方で、多くの分析や可視化の作業はロング形式のデータのほうが扱いやすいことがよくあります。
pandas.melt()関数は、1 つ以上の列を行に変換して DataFrame の形状を変更し、選択した識別子列はそのまま保持します。これにより、データのフィルタリング、グルーピング、可視化、分析がしやすくなります。このチュートリアルでは、
pandas.melt()関数の使い方を説明します。また、pivot()、stack()、wide_to_long()といった他の選択肢との違いについても解説します。Python をこれから学ぶ方には、データ型、リスト、基本的な関数、パッケージといったスキルを扱う 私たちの Introduction to Python コースの受講をおすすめします。pandas.melt() の使い方
pandas.melt()は、列見出しを新しい列の値に変換することで、DataFrame をワイド形式からロング形式に変換します。構文は次のとおりです。
各引数の意味は次のとおりです。
frame: 形状を変更する対象の DataFrame。pandas.melt()を使用する場合のみ必須です。id_vars: 変更せずに保持する列、またはそのリスト。整形後の各行を識別する列です。value_vars: アンピボットする列、またはそのリスト。省略すると、pandas はid_varsに含まれないすべての列を melt 対象とします。var_name: 元の列名を格納する新しい列の名前。指定しない場合はデフォルトで"variable"になります。value_name: 値を格納する新しい列の名前。指定しない場合はデフォルトで"value"になります。col_level: 任意。MultiIndex の列を扱うときに、どのレベルを melt するかを指定します。ignore_index:True(デフォルト)の場合は新しい連番のインデックスを作成します。Falseの場合は元のインデックスを保持します。上記の構文がどのようにデータを整形するか、例で見てみましょう。
次のようなデータセットがあり、各製品の月次売上が個別の列に格納されているとします。
pandas.melt()を使って、月の列を行に変換できます。変換後の DataFrame では、各月が個別の行として保存されます。
pandas.melt() のよくある例
すでに
pandas.melt()の構文が分かったところで、各引数が個別にどう動作するかを見ていきます。以下の例では、上の表を使用します。特定の列だけを melt する
value_vars引数を使うと、アンピボットする列を指定できます。すべての月を melt する代わりに、必要な列だけを変換できます。この例では、January と February の列だけを melt し、残りの月の列は無視しています。
識別子列を保持する
id_vars引数を使うと、他の列を整形する間に、1 列または複数列をそのまま保持できます。次の例では「Product」と「Category」はそのまま保持し、各月の売上列を行に変換しています。
出力列名を変更する
既定では、出力列の名前は
variableとvalueになります。var_nameとvalue_nameを使って、より分かりやすい名前に変更しましょう。例えば、以下の出力では variable 列を「Month」、value 列を「Sales」に変更しています。
元のインデックスを保持する
デフォルトでは、
pandas.melt()は新しい連番インデックスを作成します。元の行インデックスを保持するには、ignore_index=Falseを指定します。上の例では、新しい連番インデックスに置き換えられるのではなく、元の行ラベル(0〜5)が各月について繰り返されています。
pandas.melt() を使うべきタイミング
pandas.melt()は、データがワイド形式で、それを分析や可視化のためにロング形式へ変換する必要があるときに有用です。加えて、次のような用途でも重要だと感じています。ワイド形式のデータをロング形式に変換する: 多くのデータセットでは、関連する値が複数の列に分かれて保存されています。この形式は読みやすい反面、分析を難しくすることがあります。
pandas.melt()はそれらの列を 1 列にまとめ、識別子列を保持しつつ、後続の処理に適したすっきりした構造にします。可視化のための前処理: Seaborn など多くの可視化ライブラリは、チャート作成時にロング形式のデータとの相性が良いです。複数列を手作業で結合する代わりに、
pandas.melt()を使って、これらのライブラリが期待する形式に整形できます。統計分析のための前処理:
groupby()、集約、フィルタリング、要約統計など多くの pandas の操作は、測定値が複数列に分散しているよりも 1 列にまとまっているほうが簡単です。pandas.melt()でデータを整形しておけば、異なる変数を分析するために必要なコード量を減らせます。整然データ(tidy data)を作る: 整然データでは、各変数が独自の列に、各観測が独自の行に格納されます。データセットに複数列にわたる反復測定が含まれている場合、
pandas.melt()は整然形式に素早く変換するための近道になることが多いです。Python で散布図、カウントプロット、棒グラフ、箱ひげ図などを作成・カスタマイズする方法は、Introduction to Data Visualization with Seaborn コースで学べます。
pandas.melt() と他の整形関数の比較
Pandas にはデータの整形に使える複数の関数があり、それぞれ目的が異なります。各メソッドの違いを見ていきましょう。
pandas.melt() と pivot() の比較
次の表は、
pandas.melt()とpivot()の違いを示しています。melt()pivot()ワイドデータをロングデータに変換します。
ロングデータをワイドデータに変換します。
列を行に変換します。
行の値を列に変換します。
分析や可視化の前処理に有用です。
要約やレポートでの提示に有用です。
したがって、
melt()は測定値が複数の列に分散している場合に、pivot()は行の値を列に展開したい場合に選んでください。pandas.melt() と stack() の比較
どちらの関数もデータの形状を変更しますが、違いは次のとおりです。
melt()stack()通常の列を行に整形します。
1 つ以上の列レベルをインデックスへ移動します。
標準的な DataFrame を生成します。
MultiIndex を持つ Series または DataFrame を生成します。
多くの分析タスクで読みやすく使いやすいです。
インデックスベースの整形操作に適しています。
階層型インデックスや MultiIndex を扱う必要がある場合は、
stack()を使用できます。pandas.melt() と wide_to_long() の比較
どちらの関数もワイドデータをロング形式に変換しますが、設計上の用途が異なります(以下参照)。
melt()wide_to_long()柔軟で、ほぼあらゆる DataFrame に対応します。
一貫した列名パターンを持つデータセット向けに設計されています。
汎用的な整形に適しています。
Sales_2023、Sales_2024、Sales_2025 のような反復測定に最適です。
列名が不規則なデータセットなら
melt()を、列が予測可能な命名規則に従っているなら、より少ないコードで整形できるwide_to_long()を使いましょう。pandas.melt() でよくあるミス
pandas.melt()は比較的簡単に使えますが、よく見かける落とし穴と、その対処法を挙げます。id_vars を指定し忘れる:
id_varsを指定しないと、value_varsに含まれないすべての列が値の列として扱われます。保持したい識別子列まで整形されてしまう可能性があります。解決策として、各レコードを一意に表す列を必ず特定し、それらをid_varsに渡してください。意図しない列を melt してしまう:
value_varsを省略すると、id_varsに含まれていないすべての列が melt されます。意図しない列が整形対象に含まれることがあるため、列の一部だけを melt したい場合は常にvalue_varsを指定してください。出力形状の誤解: melt 後は、選択した各列が各レコードに対して個別の行になるため、行数が増加します。例えば、10 行と 12 の月列を持つ DataFrame は、月列を melt すると 120 行になります。したがって、意図どおりに melt できたか確認するため、整形の前後で形状を必ず確認してください。
ワイド形式とロング形式の混同: ワイド形式では、同種の値が複数の列に分かれて保存されます。ロング形式では、同種の値は 1 列にまとまり、別の列が変数を識別します。この違いを常に意識しましょう。
pandas.melt() を使う際のベストプラクティス
整形コードを分かりやすく保守しやすくするために、
pandas.melt()を使用するときは次のベストプラクティスに従うことをおすすめします。まず識別子列を特定する: どの列を変更せずに保持するかを決め、
id_varsに渡します。生成される列名を付け替える: 既定の variable と value に頼らず、
var_nameとvalue_nameを使いましょう。melt 後の行数を確認する: 特に多くの列を melt する場合は、行数が想定どおりか検証します。
元に戻すには pivot() を使う: 分析後に元のワイド形式へ戻す必要がある場合は、
pivot()を使用します。効率的で、デバッグと保守がしやすいコードの書き方は、私たちの Writing Efficient Python Code コースで学べます。
まとめ
pandas.melt()は、ワイド形式のデータをロング形式へ変換するための標準的な pandas 関数です。id_varsとvalue_varsの役割を理解すれば、どの列を識別子として残し、どの列を行に変換するかを制御できます。Python をしっかり学ぶには、Python Data Fundamentals と Python Programming Fundamentals のスキルトラックもご覧ください。