Pandasでピボットテーブルを作成し集計する方法

プログラミング

Pandasでのピボットテーブル作成と集計

Pandasライブラリは、Pythonでデータ分析を行う上で非常に強力なツールです。その中でも、データ集計や分析を効率的に行うための機能として「ピボットテーブル」は欠かせません。ピボットテーブルは、表形式のデータを特定の列の値を行や列のインデックス、そして集計値として再構成する機能です。これにより、データの傾向を把握したり、特定の条件での集計値を容易に得ることができます。

ピボットテーブルの基本構造と作成方法

Pandasでピボットテーブルを作成するには、主に`pivot_table()`関数を使用します。この関数は、DataFrameを引数として受け取り、以下の主要な引数を指定することでピボットテーブルを生成します。

  • data: ピボットテーブルを作成する元のDataFrameを指定します。
  • index: 新しいDataFrameのインデックス(行ラベル)として使用する列名を指定します。複数指定することも可能です。
  • columns: 新しいDataFrameの列ラベルとして使用する列名を指定します。複数指定することも可能です。
  • values: 集計対象となる列名を指定します。省略した場合、数値型の全列が対象となります。
  • aggfunc: 集計関数を指定します。デフォルトは平均値(mean)ですが、合計(sum)、個数(count)、最大値(max)、最小値(min)、中央値(median)など、様々な関数を指定できます。また、複数の集計関数をリストで指定することも可能です。
  • fill_value: 集計結果が欠損値(NaN)になる場合に、その欠損値を補完する値を指定します。
  • margins: 総計(grand totals)を行や列に追加するかどうかを指定します。`True`にすると、行の総計と列の総計が追加されます。
  • dropna: 全ての列の値が欠損値である行を削除するかどうかを指定します。デフォルトは`True`です。

簡単な例

以下に、簡単な例を示します。

import pandas as pd

data = {
    'Category': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
    'Subcategory': ['X', 'Y', 'Y', 'X', 'X', 'Y', 'Y', 'X'],
    'Value1': [10, 20, 15, 25, 12, 22, 18, 28],
    'Value2': [100, 200, 150, 250, 120, 220, 180, 280]
}
df = pd.DataFrame(data)

# 'Category'を行、'Subcategory'を列、'Value1'の合計を集計
pivot_sum = pd.pivot_table(df, index='Category', columns='Subcategory', values='Value1', aggfunc='sum')
print(pivot_sum)

このコードは、’Category’をインデックス、’Subcategory’を列とし、’Value1’の合計を計算します。

出力例

Subcategory   X     Y
Category
A            32   33
B            45   42

高度な集計と複数列の利用

`pivot_table()`関数は、単一の集計だけでなく、より複雑な集計も可能です。

複数列をvaluesに指定する

`values`引数に複数の列名をリストで指定すると、それぞれの列に対して指定された集計関数が適用されます。

# 'Value1'と'Value2'の平均値を集計
pivot_mean_multi = pd.pivot_table(df, index='Category', columns='Subcategory', values=['Value1', 'Value2'], aggfunc='mean')
print(pivot_mean_multi)

複数集計関数を指定する

`aggfunc`引数に複数の集計関数をリストで指定すると、それぞれの関数が適用された結果が表示されます。

# 'Value1'の合計と平均値を集計
pivot_multi_agg = pd.pivot_table(df, index='Category', columns='Subcategory', values='Value1', aggfunc=['sum', 'mean'])
print(pivot_multi_agg)

複数インデックスと複数カラム

`index`や`columns`引数に複数の列名をリストで指定すると、階層的なインデックスやカラムを持つピボットテーブルを作成できます。

# 'Category'と'Subcategory'をインデックス、'Value1'の合計を集計
pivot_multi_index = pd.pivot_table(df, index=['Category', 'Subcategory'], values='Value1', aggfunc='sum')
print(pivot_multi_index)

欠損値の処理と総計の表示

ピボットテーブル作成時には、欠損値の処理や総計の表示が重要になります。

fill_valueによる欠損値補完

`fill_value`引数を使用することで、集計結果で発生する欠損値を指定した値で補完できます。例えば、出現しない組み合わせのセルを0で埋めたい場合などに便利です。

pivot_filled = pd.pivot_table(df, index='Category', columns='Subcategory', values='Value1', aggfunc='sum', fill_value=0)
print(pivot_filled)

marginsによる総計の表示

`margins=True`と指定すると、各行および各列の合計値(デフォルトでは平均値)が表示され、データ全体の傾向を把握しやすくなります。

pivot_margins = pd.pivot_table(df, index='Category', columns='Subcategory', values='Value1', aggfunc='sum', margins=True)
print(pivot_margins)

この場合、`All`という行と列が追加され、それぞれ行の合計と列の合計、そして全体の合計が表示されます。

pivot_table() と groupby() の比較

Pandasでは、`groupby()`関数と`agg()`関数を組み合わせることでも、ピボットテーブルと同様の集計を行うことができます。

groupby() による集計

grouped_sum = df.groupby(['Category', 'Subcategory'])['Value1'].sum().unstack()
print(grouped_sum)

`groupby()`は指定した列でデータをグループ化し、`agg()`(または直接集計関数)で集計を行います。その後、`unstack()`メソッドを使用することで、ピボットテーブルのような形式に変換できます。

使い分け

* pivot_table(): より直感的で、インデックス、カラム、値、集計関数といったピボットテーブルの概念が明確に表現されています。特定の列の組み合わせでデータを整形したい場合に、コードが簡潔になることが多いです。
* groupby(): 柔軟性が高く、より複雑な集計ロジックを記述しやすい場合があります。また、ピボットテーブルに変換する前の段階で、グループごとの集計結果をそのまま利用したい場合にも適しています。

どちらの方法も強力ですが、目的に応じて使い分けることで、より効率的なデータ分析が可能になります。

まとめ

Pandasの`pivot_table()`関数は、データ分析において非常に強力で柔軟な集計ツールです。行、列、値、集計関数を適切に指定することで、データの多角的な分析が可能になります。欠損値の補完や総計の表示といった機能も充実しており、データの可視化やレポート作成の前処理として非常に有用です。`groupby()`と組み合わせることで、さらに高度な集計も実現でき、Pandasを用いたデータ分析の幅を大きく広げることができます。