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を用いたデータ分析の幅を大きく広げることができます。
