Pandas pivot 徹底解説: データをワイド形式に再構築!


 

データ分析や可視化の準備において、データの「形」を適切に整えることは非常に重要です。特に、統計分析やグラフ描画に適したロング形式のデータ(カテゴリ変数の値が列として並び、その値が別の列に集約されている形式)を、人間が読みやすい表や特定の分析要件に合わせたワイド形式(列数が多く、各列が異なる変数に対応している形式)に変換したい場面は多々あります。そんな時に役立つのが、Pandasの強力なメソッド**pivot**です。

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


 

Pandas pivotってどんなもの?

 

Pandasのpivotメソッドは、DataFrameをロング形式からワイド形式へ変換するために使用されます。これは、Excelのピボットテーブルに似ていますが、pivot集計機能を持たず、単に既存の列の値を新しい列名として再配置する点に注意が必要です。もし集計も同時に行いたい場合は、pivot_tableを使用します。

pivotは、以下の3つの要素を指定してデータを再構築します。

  1. index: 新しいワイド形式のDataFrameの行インデックスとなる列。

  2. columns: 新しいワイド形式のDataFrameの列名となる列。

  3. values: 新しいワイド形式のDataFrameのセルに表示される値となる列。

 

pivotでできること

 

  • データ整形: 特定の分析やレポート作成のために、データをワイド形式に変換します。

  • データのクロス集計準備: pivotで整形した後、別途集計関数を適用する前の段階で利用します。

  • 可読性の向上: 特定のカテゴリごとの値を横並びで比較したい場合に役立ちます。


 

なぜpivotを選ぶべきか?

 

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

  • シンプルで直感的: データの「回転」という概念が直接メソッド名に反映されており、目的が明確です。

  • 高速性: 単純なデータ再配置のため、pivot_tableが集計も行うよりも高速に処理できる場合があります。

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

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


 

pivotを始めるための準備

 

 

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

 

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

Python
 
import pandas as pd

# サンプルデータフレームの作成 (ロング形式)
# 各地域、各年の売上データが縦に並んでいる想定
data = {
    'Region': ['East', 'East', 'East', 'West', 'West', 'West'],
    'Year': [2022, 2023, 2024, 2022, 2023, 2024],
    'Sales': [100, 110, 120, 150, 160, 170],
    'Customers': [20, 22, 25, 30, 32, 35]
}
df_long = pd.DataFrame(data)

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

 

pivotの基本的な使い方

 

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

  • index: 新しいDataFrameの行インデックスにする列名。

  • columns: 新しいDataFrameの列名にする列名。

  • values: 新しいDataFrameのセルに入れる値を持つ列名。valuesを省略すると、indexcolumns以外のすべての列が値として扱われ、結果は多階層カラムを持つDataFrameになります。

 

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

 

 

例1: Regionを行、Yearを列にしてSalesを値にする

 

各地域の各年の売上データを、年が列として横並びになるように変換します。

Python
 
# 'Region'を行インデックス、'Year'を列、'Sales'を値としてピボット
df_pivot_sales = df_long.pivot(index='Region', columns='Year', values='Sales')

print("--- Salesを値としたピボット (ワイド形式) ---")
print(df_pivot_sales)
print("\n")

 

例2: 複数の値列をピボットする

 

valuesを省略するか、リストで複数の列を指定すると、新しいDataFrameの列が多階層になります。

Python
 
# 'Region'を行インデックス、'Year'を列、'Sales'と'Customers'を値としてピボット
df_pivot_multi_values = df_long.pivot(index='Region', columns='Year') # valuesを省略

print("--- 複数の値列をピボット ---")
print(df_pivot_multi_values)
print("\n")

この結果、SalesCustomersという最上位の列の中に、それぞれの年ごとのデータがネストされた多階層カラムのDataFrameが生成されます。


 

pivotpivot_tableの使い分け

 

pivotpivot_tableは似ていますが、重要な違いがあります。

  • pivot():

    • 集計機能を持たない。単にデータの形状を再構築する。

    • indexcolumnsの組み合わせが一意である必要がある。もし重複する組み合わせがあるとエラーが発生します(ValueError: Index contains duplicate entries, cannot reshape)。

    • 目的: 単純なデータのリシェイプ。

  • pivot_table():

    • 集計機能を持つaggfunc引数で合計、平均などの集計方法を指定できる。

    • indexcolumnsの組み合わせが重複しても問題ない。重複する場合はaggfuncで指定した方法で集計される。

    • 目的: クロス集計、多角的なデータ集計。

簡単な使い分けの例:

  • pivotを使うべき場合: 各月の売上データが「日付」「商品」「売上高」というロング形式で、同じ日付・商品が複数回登場しない場合に、「日付」を行、「商品」を列に、売上高を値にする。

  • pivot_tableを使うべき場合: 同じ日付・同じ商品で複数の売上記録がある場合(例: 複数の顧客からの注文)、それを「日付」と「商品」で集計(合計など)したい場合。


 

pivotの注意点と応用

 

 

1. 重複するインデックス/カラムの組み合わせ

 

前述の通り、pivotindexcolumnsで指定した組み合わせがユニークでないとエラーになります。このような場合はpivot_tableを使うのが適切です。

 

エラーの例 (実行するとValueErrorが発生):

 

Python
 
# 重複データを含むデータフレーム
df_duplicate = pd.DataFrame({
    'ID': [1, 1, 2],
    'Category': ['A', 'A', 'B'],
    'Value': [10, 20, 30]
})

# IDとCategoryの組み合わせ (1, 'A') が重複しているためエラー
# df_duplicate.pivot(index='ID', columns='Category', values='Value')
# -> ValueError: Index contains duplicate entries, cannot reshape

これを解決するにはpivot_tableを使います。

Python
 
df_pivot_table_fix = df_duplicate.pivot_table(index='ID', columns='Category', values='Value', aggfunc='sum')
print("--- pivot_tableで重複を処理 ---")
print(df_pivot_table_fix)
print("\n")

 

まとめ

 

この記事では、Pandasでロング形式のデータをワイド形式に効率的に再構築するための**pivot**メソッドについて、その特徴、基本的な使い方、そしてpivot_tableとの違いや使い分けを徹底的に解説しました。

pivotを適切に活用することで、データの形状を分析や可視化の要件に合わせて柔軟に調整し、データ分析の準備作業を大幅に効率化できます。特に、データが重複のない「キー」と「値」の組み合わせで構成されている場合に、pivotはそのシンプルさと高速性で真価を発揮するでしょう。

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

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

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

■テックジム東京本校

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

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

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

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