閉じる

Pandasのaggメソッドで集計を効率化!複数列の同時処理とカスタマイズ術

データ分析の現場において、膨大なデータから意味のある数値を抽出する「集計」は、最も頻繁に行われる作業の一つです。

Pythonのデータ分析ライブラリであるPandasには、非常に強力な集計用メソッドであるagg(aggregate)が用意されています。

aggメソッドを活用することで、複数の列に対して異なる集計処理を一度に適用したり、独自の計算ロジックを組み込んだりすることが可能になります。

本記事では、実務で役立つaggメソッドの基本的な使い方から、応用的なカスタマイズ術までを詳しく解説します。

Pandasのaggメソッドが選ばれる理由

Pandasにはsum()mean()といった個別の集計用メソッドが用意されていますが、実務のデータ集計ではそれだけでは不十分なケースが多々あります。

例えば、「売上列は合計し、客数列は平均を出し、来店日は最新の日付を取得したい」といった複雑な要望がある場合、個別のメソッドを何度も呼び出すのは非効率です。

aggメソッドを使用すれば、これらの多様な処理をひとつのコードブロックで簡潔に記述できます。

コードの可読性が高まるだけでなく、処理の記述ミスを減らすことができるため、モダンなデータサイエンスの現場では必須のスキルと言えます。

基本的な集計処理の書き方

まずは、aggメソッドの最もシンプルな使い方を確認しましょう。

aggは、DataFrame全体や特定の列に対して、文字列で関数名を指定することで集計を実行します。

Python
import pandas as pd
import numpy as np

# サンプルデータの作成
df = pd.DataFrame({
    'category': ['A', 'A', 'B', 'B', 'C'],
    'sales': [100, 200, 150, 300, 250],
    'quantity': [1, 2, 3, 4, 5]
})

# sales列の合計と平均を一度に算出
result = df['sales'].agg(['sum', 'mean'])
print(result)
実行結果
sum     1000.0
mean     200.0
Name: sales, dtype: float64

このように、集計したい関数をリスト形式で渡すだけで、複数の統計量を同時に算出できます。

aggメソッドは内部的に最適化されており、大きなデータセットに対しても高速に動作するように設計されています。

GroupByと組み合わせた集計

実務で最も頻繁に使用されるのが、groupbyメソッドと組み合わせたグループ別の集計です。

特定のカテゴリごとに、複数の指標を算出し、データの傾向を把握する際に非常に役立ちます。

Python
# カテゴリごとにsalesの合計とquantityの平均を算出
grouped_result = df.groupby('category').agg(['sum', 'mean'])
print(grouped_result)
実行結果
         sales        quantity     
           sum   mean      sum mean
category                           
A          300  150.0        3  1.5
B          450  225.0        7  3.5
C          250  250.0        5  5.0

この方法では、すべての列に対して共通の集計関数が適用されるため、結果としてマルチインデックスの列が生成されます。

辞書形式による列別の集計カスタマイズ

「列ごとに適用する集計関数を変えたい」という場合には、辞書形式で指定する方法が最も適しています。

agg({'列名': '関数名'})という構文を用いることで、ピンポイントで集計内容を制御できます。

Python
# 列ごとに異なる関数を指定
custom_agg = df.groupby('category').agg({
    'sales': 'sum',
    'quantity': 'mean'
})
print(custom_agg)
実行結果
          sales  quantity
category                 
A           300       1.5
B           450       3.5
C           250       5.0

この書き方を用いると、出力されるDataFrameの列構造がフラットに保たれるため、その後のデータ加工が非常にスムーズになります。

また、特定の列に対してのみ複数の関数を適用したい場合も、値をリストにすることで対応可能です。

Python
# 特定の列に複数の関数を混在させる
mixed_agg = df.groupby('category').agg({
    'sales': ['sum', 'max'],
    'quantity': 'mean'
})
print(mixed_agg)
実行結果
         sales      quantity
           sum  max     mean
category                    
A          300  200      1.5
B          450  300      3.5
C          250  250      5.0

Named Aggregationで可読性を向上させる

Pandas 0.25.0以降で導入された「Named Aggregation」は、集計後の列名をあらかじめ指定できる便利な機能です。

従来のaggでは、集計後の列名が自動的に関数名になってしまい、後からrenameメソッドで変更する手間がありました。

Named Aggregationを使用すれば、集計処理とリネームを同時に行うことができます。

Python
# Named Aggregationの例
named_result = df.groupby('category').agg(
    total_sales=('sales', 'sum'),
    avg_quantity=('quantity', 'mean')
)
print(named_result)
実行結果
          total_sales  avg_quantity
category                           
A                 300           1.5
B                 450           3.5
C                 250           5.0

この構文の利点は、タプル形式(列名, 関数名)を使用することで、コードの意図が明確になる点にあります。

「どの列を」「どう集計し」「どんな名前にするか」が一目でわかるため、チーム開発においても非常に推奨される書き方です。

ラムダ式を用いた独自集計の実装

標準的な関数(sum, mean, maxなど)だけでは要件を満たせない場合、ラムダ式(無名関数)を使用して独自の集計ロジックを実装できます。

例えば、「最大値と最小値の差(範囲)」を求めたい場合などは、以下のように記述します。

Python
# ラムダ式による範囲計算
range_agg = df.groupby('category').agg({
    'sales': lambda x: x.max() - x.min()
})
range_agg.rename(columns={'sales': 'sales_range'}, inplace=True)
print(range_agg)
実行結果
          sales_range
category             
A                 100
B                 150
C                   0

ただし、ラムダ式を使用する際には注意点があります。

Pandasの組み込み関数(文字列で指定するもの)に比べると、ラムダ式はPythonループとして実行されるため、処理速度が低下する傾向にあります。

数百万行を超えるような大規模データを扱う場合は、可能な限りNumPy関数やPandasの標準関数を検討し、どうしても必要な場合にのみラムダ式を使用しましょう。

よく使われる集計関数一覧

aggメソッドで指定できる代表的な関数を以下の表にまとめました。

指定キーワード内容
'sum'合計値を算出します。
'mean'平均値を算出します。
'median'中央値を算出します。
'std'標準偏差を算出します。
'var'分散を算出します。
'min' / 'max'最小値または最大値を算出します。
'count'欠損値を除いた要素数をカウントします。
'nunique'ユニークな値の個数をカウントします。
'first' / 'last'最初または最後の要素を取得します。

これらのキーワードは文字列として渡すことができるため、コードが非常にシンプルになります。

aggメソッド活用時のパフォーマンス改善のコツ

効率的な集計を行うためには、関数の指定方法にも工夫が必要です。

たとえば、df.agg(np.sum)と書くよりも、文字列でdf.agg('sum')と書く方が、Pandasの内部で最適化されたCython実装が呼ばれるため高速です。

また、集計前に不要な列をフィルタリングしておくことも、メモリ使用量を抑える上で重要です。

大量のデータを処理する際は、「必要な列だけを選択してからgroupbyとaggを行う」という順序を徹底しましょう。

Python
# 良い例:必要な列だけを先に絞り込む
optimized_result = df[['category', 'sales']].groupby('category').agg('sum')

このように、ちょっとした書き方の違いが、大規模データ処理における実行時間の大きな差に繋がります。

実戦例:ビジネス指標の多角的な算出

より実戦に近い例として、ECサイトの注文データを想定した集計を行ってみましょう。

顧客ごとの「合計購入金額」「平均購入単価」「初回購入日」「購入回数」を一度に算出します。

Python
# サンプル注文データの作成
order_df = pd.DataFrame({
    'customer_id': [101, 101, 102, 103, 102, 101],
    'amount': [5000, 3000, 12000, 4500, 8000, 2000],
    'order_date': pd.to_datetime(['2026-01-10', '2026-01-15', '2026-01-11', '2026-01-12', '2026-01-20', '2026-02-01'])
})

# ビジネス指標を一括集計
customer_stats = order_df.groupby('customer_id').agg(
    total_spend=('amount', 'sum'),
    avg_spend=('amount', 'mean'),
    first_order=('order_date', 'min'),
    order_count=('amount', 'count')
)

print(customer_stats)
実行結果
             total_spend    avg_spend first_order  order_count
customer_id                                                   
101                10000  3333.333333  2026-01-10            3
102                20000 10000.000000  2026-01-11            2
103                 4500  4500.000000  2026-01-12            1

このように、異なるデータ型の列(数値と日付など)が混在していても、適切に関数を選べば一撃で集計が完了します。

この結果をCSVに出力したり、グラフ化したりすることで、素早い意思決定に繋げることが可能になります。

まとめ

Pandasのaggメソッドは、データ集計の柔軟性と効率を劇的に向上させるツールです。

単一の統計量だけでなく、複数の列に対して異なる集計を適用したり、独自の計算を加えたりすることで、複雑なデータセットも思い通りに要約できます。

特に「辞書形式による指定」「Named Aggregation」は、コードの保守性と可読性を高めるために積極的に活用すべきテクニックです。

集計処理をマスターすることで、データクリーニングから分析レポートの作成までのスピードが格段に上がります。

ぜひ今回の内容を参考に、日々のデータ分析業務にaggメソッドを取り入れてみてください。

URLをコピーしました!