はじめに
Pandasは、データ操作や分析に柔軟に対応するためのPythonライブラリです。SeriesやDataFrameなどのデータ構造を提供しており、構造化されたデータの操作が容易になっています。Pandasのもっとも便利な機能の1つは、データを効率的に集計やグループ化できることで、グループ化されたデータに対してさまざまな操作を実行することができます。この記事では、Pandasを使ったデータの集計とグループ化の手順について説明します。
GroupByオブジェクト
PandasのGroupByオブジェクトを使うと、1つ以上の列でデータを効率的にグループ化し、グループ化されたデータに対してさまざまな操作を行うことができます。この章では、GroupByオブジェクトの作成、列や行の選択、グループごとの反復について説明します。
GroupByオブジェクトの作成
GroupByオブジェクトを作成するには、グループ化するデータを持つDataFrameが必要です。この例では、Category
列とValue
列を持つDataFrameを用意しています。
import pandas as pd
data = {'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Value': [10, 20, 30, 40, 50, 60]}
df = pd.DataFrame(data)
GroupByオブジェクトを作成するには、DataFrameの.groupby()
メソッドを使用して、グループ化する列名を渡します。
grouped = df.groupby('Category')
grouped
変数には、Category
列でグループ化されたデータを含むGroupByオブジェクトが格納されます。
列と行の選択
GroupByオブジェクトを作成したら、.get_group()
メソッドを使用して特定のグループを選択できます。例えば、カテゴリがA
のグループを選択するには、次のようにします。
grouped.get_group('A')
Category Value
0 A 10
2 A 30
4 A 50
これにより、カテゴリがA
の行だけを含むDataFrameが返されます。
グループごとの反復
forループを使ってGroupByオブジェクト内のグループを反復処理することもできます。ループは、グループ名と対応するグループのDataFrameの両方をyieldします。
for name, group in grouped:
print(name)
print(group)
A
Category Value
0 A 10
2 A 30
4 A 50
B
Category Value
1 B 20
3 B 40
5 B 60
この例では、ループはグループ名(A
またはB
)と、そのカテゴリに属する行を含むDataFrameを印字します。これは、各グループごとに個別の分析を実行するか、グループを個別のファイルに保存するために役立ちます。
集計関数
集計関数を使うと、グループ化されたデータに対して計算を行うことができます。例えば、各グループ内の値の合計、平均、数を見つけるなどが挙げられます。この章では、組み込みの集計関数、カスタムの集計関数の作成、複数の集計関数を一度に適用する方法について説明します。
組み込みの集計関数
Pandasは、GroupByオブジェクトに直接適用できるいくつかの組み込み集計関数を提供しています。代表的な集計関数には以下があります。
.sum()
: 各グループ内の値の合計を計算.mean()
: 各グループ内の値の平均を計算.count()
: 各グループ内の値の数を数える
例えば、Value
列の合計を計算するには、.sum()
メソッドを使用できます。
grouped.sum()
Value
Category
A 90
B 120
これにより、各カテゴリごとのValue
列の合計を含むDataFrameが返されます。
カスタムの集計関数
組み込みの集計関数が要件を満たさない場合は、独自のカスタム集計関数を作成することができます。これを行うには、入力としてSeriesまたはDataFrameを取り、単一の値を返す関数を定義します。次に、.aggregate()
または.agg()
メソッドを使用して、GroupByオブジェクトにカスタム関数を適用します。
例えば、各グループ内の値の合計をその値の数で割ったものを計算するには、次のようにカスタム集計関数を作成できます。
def custom_agg(x):
return x.sum() / x.count()
grouped.aggregate(custom_agg)
Value
Category
A 30
B 40
これにより、各グループにカスタム集計関数を適用した結果を示すDataFrameが返されます。
複数の集計関数を適用
複数の集計関数を一度にGroupByオブジェクトに適用するには、.agg()
メソッドに関数のリストを渡します。その結果、元の列名を表す上位レベルと、適用された集計関数を表す下位レベルを持つ階層的な列構造のDataFrameが返されます。
例えば、各グループ内のValue
列の合計、平均、数を計算するには、次のようにします。
grouped.agg(['sum', 'mean', 'count'])
Value
sum mean count
Category
A 90 30 3
B 120 40 3
これにより、各グループに指定された集計関数を適用した結果が含まれるDataFrameが返されます。
ピボットテーブル
ピボットテーブルは、指定された列に基づいてデータを再形成および集計することで、データを要約する方法を提供します。この章では、ピボットテーブルの作成、ピボットテーブル値のカスタマイズ、欠損データの処理について説明します。
ピボットテーブルの作成
ピボットテーブルを作成するには、pd.pivot_table()
関数を使用します。この関数には、次の引数があります。
data
: ピボットするDataFramevalues
: 集計するデータが含まれる列index
: ピボットテーブル内の行ラベルとして使用する列columns
:(オプション)ピボットテーブル内の列ラベルとして使用する列aggfunc
: 適用する集計関数
例えば、カテゴリごとのValue
列の合計を示すピボットテーブルを作成するには、次のようにします。
pivot = pd.pivot_table(df, values='Value', index='Category', aggfunc='sum')
Value
Category
A 90
B 120
これにより、カテゴリごとのValue
列の合計を示すピボットテーブルが返されます。
ピボットテーブル値のカスタマイズ
ピボットテーブルの値をカスタマイズするには、異なる集計関数を指定するか、複数の列または関数を含めることができます。これを行うには、values
、index
、columns
、またはaggfunc
引数に列名または関数のリストを渡します。
例えば、カテゴリごとのValue
列の合計と平均を両方表示するピボットテーブルを作成するには、次のようにします。
pd.pivot_table(df, values='Value', index='Category', aggfunc=['sum', 'mean'])
sum mean
Value Value
Category
A 90 30
B 120 40
これにより、上位レベルが適用された集計関数を表し、下位レベルが元の列名を表す階層的な列構造のDataFrameが返されます。
欠損データの処理
ピボットテーブルは、カテゴリカルデータを扱う場合に特に、欠損データを含むセルを生成する場合があります。ピボットテーブルの欠損データを処理するには、fill_value
引数を使用して、欠損データを置換するデフォルト値を指定できます。
例えば、対応する値がない追加のカテゴリC
を持つDataFrameがあるとします。
data = {'Category': ['A', 'B', 'A', 'B', 'A', 'B', 'C'],
'Value': [10, 20, 30, 40, 50, 60, None]}
df = pd.DataFrame(data)
デフォルトでは、ピボットテーブルでは欠損データに対してNaN
の値が表示されます。
pd.pivot_table(df, values='Value', index='Category', aggfunc='sum')
Value
Category
A 90.0
B 120.0
C NaN
欠損データを指定されたデフォルト値に置き換えるには、fill_value
引数を使用します。
pd.pivot_table(df, values='Value', index='Category', aggfunc='sum', fill_value=0)
Value
Category
A 90
B 120
C 0
これにより、指定されたデフォルト値に欠損データが置き換えられた、各カテゴリのValue
列の合計を示すピボットテーブルが返されます。