Pandas melt 徹底解説: ワイド形式からロング形式へデータを整形!


 

データ分析や可視化を行う際、データの「形」は非常に重要です。特に、表計算ソフトでよく見かけるワイド形式のデータ(列数が多く、各列が異なる変数に対応している形式)を、統計分析やグラフ描画に適したロング形式(行数が多く、カテゴリ変数の値が列として並び、その値が別の列に集約されている形式)に変換したい場面は多々あります。そんな時に役立つのが、Pandasの強力なメソッド**melt**です。

この記事では、Pandas meltの基本的な使い方から、効率的なデータ整形を可能にする応用テクニックまで、徹底的に解説します。


 

Pandas meltってどんなもの?

 

Pandasのmeltメソッドは、DataFrameをワイド形式からロング形式(または「tidy data」形式)へ変換するために使用されます。これにより、複数の「測定値の列」を、新しい「変数名」と「変数に紐づく値」の2つの列に「溶解(melt)」させます。

 

meltでできること

 

  • データ整形: 可視化ライブラリ(Seaborn, Plotlyなど)や統計モデル(scikit-learnなど)が求めるロング形式のデータに変換します。

  • 分析の効率化: カテゴリ変数と測定値を分離することで、グループごとの集計や比較が容易になります。

  • コードの簡潔化: 複雑なループや条件分岐なしに、数行のコードでデータを整形できます。


 

なぜmeltを選ぶべきか?

 

データ整形の手法は他にもありますが、meltを使うことには以下のようなメリットがあります。

  • 直感的でわかりやすい: 「列を溶かして行にする」というイメージが掴みやすく、直感的に操作できます。

  • 汎用性: 多様なデータセットに適用でき、幅広い分析シナリオで役立ちます。

  • 高速性: Pandasの内部最適化により、大量のデータでも効率的に処理できます。

  • 可読性の向上: コードが簡潔になるため、データ整形ロジックの可読性が向上します。


 

meltを始めるための準備

 

 

1. ライブラリのインポートとデータの準備

 

meltを使うためには、Pandasライブラリをインポートし、操作したいデータがDataFrame形式で用意されている必要があります。

Python
 
import pandas as pd

# サンプルデータフレームの作成 (ワイド形式)
# 各年の売上データが異なる列に格納されている想定
data = {
    'Region': ['East', 'West', 'North', 'South'],
    'Product_2022': [100, 150, 120, 90],
    'Product_2023': [110, 160, 130, 95],
    'Product_2024': [120, 170, 140, 100],
    'Manager': ['Alice', 'Bob', 'Charlie', 'David']
}
df_wide = pd.DataFrame(data)

print("--- 元のデータフレーム (ワイド形式) ---")
print(df_wide)
print("\n")

 

meltの基本的な使い方

 

melt関数には、主に以下の引数を指定します。

  • frame: 変換したいDataFrame。

  • id_vars: 新しいロング形式で「残しておきたい識別子となる列名」のリスト。これらの列は行の識別子としてそのまま残ります。

  • value_vars: 新しいロング形式で「溶かしたい(値として集約したい)列名」のリスト。これらの列が新しい「値」の列にまとめられます。省略するとid_vars以外のすべての列が対象になります。

  • var_name: 新しい「変数名」の列の名称。デフォルトはvariable

  • value_name: 新しい「値」の列の名称。デフォルトはvalue

 

最小限のサンプルプログラム

 

 

例1: 年ごとの売上データをロング形式に変換

 

各年の売上(Product_2022, Product_2023, Product_2024)を「Year」と「Sales」という2つの列にまとめます。RegionManagerは識別子として残します。

Python
 
# 'Region'と'Manager'を識別子として残し、'Product_YYYY'列を溶かす
df_long = pd.melt(df_wide,
                  id_vars=['Region', 'Manager'],
                  value_vars=['Product_2022', 'Product_2023', 'Product_2024'],
                  var_name='Year_Product', # 新しい変数名列の名前
                  value_name='Sales_Value') # 新しい値列の名前

print("--- 変換後のデータフレーム (ロング形式) ---")
print(df_long)
print("\n")

この結果、元のデータフレームがワイド形式だったのに対し、変換後のデータフレームは各年の売上が行として展開され、データ分析や可視化がしやすくなりました。


 

meltの応用テクニック

 

 

1. value_varsを省略する

 

value_varsを省略すると、id_varsで指定された列以外のすべての列が溶かされる対象になります。

Python
 
# 'Region'だけを識別子として残し、残りの列を全て溶かす
df_long_all_values = pd.melt(df_wide, id_vars=['Region'])

print("--- 'value_vars'省略時の変換 ---")
print(df_long_all_all_values)
print("\n")

 

2. var_namevalue_nameで列名を分かりやすくする

 

新しい変数名と値の列に分かりやすい名前を付けることで、コードの可読性が向上します。

Python
 
# 例1で既に var_name='Year_Product', value_name='Sales_Value' を使用

さらに、Year_Product列から年を抽出するような後処理も組み合わせられます。

Python
 
df_long['Year'] = df_long['Year_Product'].str.extract(r'(\d{4})')
print("--- 年を抽出したロング形式 ---")
print(df_long[['Region', 'Manager', 'Year', 'Sales_Value']])
print("\n")

 

3. データ可視化での活用例

 

meltを使ってデータをロング形式に整形することで、Seabornなどの可視化ライブラリで簡単にグループごとの比較グラフを作成できます。

Python
 
import seaborn as sns
import matplotlib.pyplot as plt

# 再度、ロング形式のデータフレームを作成(今回は年を抽出するまで行う)
df_long_viz = pd.melt(df_wide,
                      id_vars=['Region', 'Manager'],
                      value_vars=['Product_2022', 'Product_2023', 'Product_2024'],
                      var_name='Year_Product',
                      value_name='Sales')
df_long_viz['Year'] = df_long_viz['Year_Product'].str.extract(r'(\d{4})')

# 地域ごとの各年の売上推移を折れ線グラフで可視化
plt.figure(figsize=(8, 5))
sns.lineplot(data=df_long_viz, x='Year', y='Sales', hue='Region', marker='o')
plt.title('地域別・年別売上推移')
plt.xlabel('年')
plt.ylabel('売上')
plt.grid(True, linestyle='--', alpha=0.7)
plt.show()

 

まとめ

 

この記事では、Pandasでワイド形式のデータをロング形式に効率的に変換するための強力なメソッドmeltについて、その特徴、基本的な使い方、そして応用テクニックを徹底的に解説しました。

meltを使いこなすことで、複雑なデータ整形作業を簡潔なコードで実現し、データ分析や可視化の準備を格段に効率化できます。特に、可視化ライブラリや機械学習モデルへの入力データ形式を整える際に、meltはあなたの強力な味方となるでしょう。

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座