メインコンテンツへスキップ

pandas melt(): ワイド形式のデータをロング形式に変換する最適な方法

pandas.melt() を使って DataFrame をワイド形式からロング形式に整形する方法を、実用的な例と一般的なユースケースとともに学びます。
更新 2026年8月4日  · 8 分 読む

AIで探索

ChatGPTで開くClaudeで開くPerplexityで開く

ワイド形式は読みやすい一方で、多くの分析や可視化の作業はロング形式のデータのほうが扱いやすいことがよくあります。

pandas.melt() 関数は、1 つ以上の列を行に変換して DataFrame の形状を変更し、選択した識別子列はそのまま保持します。これにより、データのフィルタリング、グルーピング、可視化、分析がしやすくなります。

このチュートリアルでは、pandas.melt() 関数の使い方を説明します。また、pivot()stack()wide_to_long() といった他の選択肢との違いについても解説します。Python をこれから学ぶ方には、データ型、リスト、基本的な関数、パッケージといったスキルを扱う 私たちの Introduction to Pythonースの受講をおすすめします。

pandas.melt() の使い方

pandas.melt() は、列見出しを新しい列の値に変換することで、DataFrame をワイド形式からロング形式に変換します。

構文は次のとおりです。

pandas.melt(
    frame,
    id_vars=None,
    value_vars=None,
    var_name=None,
    value_name="value",
    col_level=None,
    ignore_index=True
)

各引数の意味は次のとおりです。

  • 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 の場合は元のインデックスを保持します。

上記の構文がどのようにデータを整形するか、例で見てみましょう。

次のようなデータセットがあり、各製品の月次売上が個別の列に格納されているとします。

ワイド形式の DataFrame の例。

pandas.melt() を使って、月の列を行に変換できます。

# 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)

変換後の DataFrame では、各月が個別の行として保存されます。

pandas.melt() を使ってロング形式に変換した DataFrame

pandas.melt() のよくある例

すでに pandas.melt() の構文が分かったところで、各引数が個別にどう動作するかを見ていきます。以下の例では、上の表を使用します。

特定の列だけを melt する

value_vars 引数を使うと、アンピボットする列を指定できます。すべての月を melt する代わりに、必要な列だけを変換できます。

この例では、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)

pandas.melt() で特定の列だけを melt する例

識別子列を保持する

id_vars 引数を使うと、他の列を整形する間に、1 列または複数列をそのまま保持できます。

次の例では「Product」と「Category」はそのまま保持し、各月の売上列を行に変換しています。

# 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()

pandas.melt() 関数で識別子列を保持する例。

出力列名を変更する

既定では、出力列の名前は variablevalue になります。var_namevalue_name を使って、より分かりやすい名前に変更しましょう。

例えば、以下の出力では variable 列を「Month」、value 列を「Sales」に変更しています。

# 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()

pandas.melt() の var_name と value_name を使って出力列名を変更する例。

元のインデックスを保持する

デフォルトでは、pandas.melt() は新しい連番インデックスを作成します。元の行インデックスを保持するには、ignore_index=False を指定します。

# 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() で 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_namevalue_name を使いましょう。

  • melt 後の行数を確認する: 特に多くの列を melt する場合は、行数が想定どおりか検証します。

  • 元に戻すには pivot() を使う: 分析後に元のワイド形式へ戻す必要がある場合は、pivot() を使用します。

効率的で、デバッグと保守がしやすいコードの書き方は、私たちの Writing Efficient Python Code コースで学べます。

まとめ

pandas.melt() は、ワイド形式のデータをロング形式へ変換するための標準的な pandas 関数です。id_varsvalue_vars の役割を理解すれば、どの列を識別子として残し、どの列を行に変換するかを制御できます。

Python をしっかり学ぶには、Python Data FundamentalsPython Programming Fundamentals のスキルトラックもご覧ください。

FAQs

pandas.melt() はいつ使うべきですか?

同種の値が列にまたがって繰り返し格納されており、分析や可視化のためにロング形式の DataFrame が必要なときに使用してください。

var_name と value_name は何ですか?

これらの引数は、元の列名とそれに対応する値を格納する生成列の名前を変更します。

pandas.melt() は元の DataFrame を変更しますか?

いいえ。元の DataFrame を変更せず、新しい形状の DataFrame を返します。

melt() と pivot() の違いは何ですか?

melt() はワイド形式をロング形式に変換し、pivot() はロング形式をワイド形式へ戻します。

melt() と stack() の違いは何ですか?

melt() は列を行に整形し、通常の DataFrame を保ちます。stack() は列をインデックスに移し、階層(MultiIndex)構造を作ります。

トピック

DataCamp で pandas を学ぶ

Courses

pandasで効率よくデータを取り込む

4時間
63.3K
CSV、スプレッドシート、JSON、SQLデータベース、APIなど、一般的な形式やシステムからデータを取得する方法を学びます。
詳細を見るRight Arrow
コースを開始
もっと見るRight Arrow