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形式で用意されている必要があります。
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つの列にまとめます。RegionとManagerは識別子として残します。
# '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で指定された列以外のすべての列が溶かされる対象になります。
# '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_nameとvalue_nameで列名を分かりやすくする
新しい変数名と値の列に分かりやすい名前を付けることで、コードの可読性が向上します。
# 例1で既に var_name='Year_Product', value_name='Sales_Value' を使用
さらに、Year_Product列から年を抽出するような後処理も組み合わせられます。
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などの可視化ライブラリで簡単にグループごとの比較グラフを作成できます。
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爆速講座

