【Pandas集計術】agg()とaggregate()で複数統計量を一括算出!データ分析を効率化 📊
データ分析において、DataFrameやSeriesのデータに対して複数の異なる集計処理(合計、平均、最大値、最小値など)を一度に適用したい場面は頻繁にあります。例えば、「各商品の売上合計と平均価格、最大在庫数を同時に知りたい」といったニーズです。このような場合、集計関数を一つずつ適用していくのは非効率で、コードも冗長になりがちです。
Pandasの**agg()メソッド**(またはそのエイリアスである**aggregate()**)は、この問題を解決するための強力なツールです。複数の集計関数を柔軟に組み合わせて、カラム全体、グループごと、または異なるカラムに異なる集計を一度に適用できます。この記事では、agg()/aggregate()の基本的な使い方から、知っておくと便利な応用例まで、短いサンプルコードと丁寧な解説を交えてご紹介します。
agg()/aggregate()メソッドとは?なぜ複数集計が必要なのか?
agg()(aggregate())メソッドは、DataFrameやSeriesのデータに対して、指定された一つまたは複数の集計関数を適用し、結果を返す機能です。
なぜ複数集計を一度に行う必要があるのでしょうか?
-
コードの簡潔化: 複数の集計関数をまとめて記述できるため、コードが短く、読みやすくなります。
-
処理の効率化: 繰り返し集計関数を呼び出すよりも、内部的に最適化された処理が行われるため、特に大規模データにおいてパフォーマンスが向上します。
-
多角的なデータ理解: データの異なる側面(例: 合計、平均、分散、カウントなど)を一度に把握することで、より多角的な洞察を得られます。
-
レポート作成の効率化: 必要な集計結果を一度に生成できるため、レポートやダッシュボード作成の準備がスムーズになります。
1. agg()の基本的な使い方
agg()メソッドは、SeriesとDataFrameのどちらにも適用できます。
Seriesに複数の集計関数を適用する
Seriesに対してagg()を適用し、集計関数をリストで渡します。
import pandas as pd
import numpy as np
# サンプルSeriesの作成
s_sales = pd.Series([100, 150, 80, 200, 120, 180])
print("元のSeries (売上データ):\n", s_sales)
# 合計と平均を同時に計算
agg_result_series = s_sales.agg(['sum', 'mean'])
print("\nSeriesの合計と平均:\n", agg_result_series)
解説:
-
s_sales.agg(['sum', 'mean']): Seriess_salesに対して、'sum'(合計)と'mean'(平均)という2つの関数を適用しています。 -
結果はSeriesとして返され、インデックスが集計関数の名前、値が計算結果となります。
DataFrameの全列に同じ集計関数を適用する
DataFrameの数値列全てに対して、同じ集計関数を適用したい場合です。
# サンプルDataFrameの作成
df_data = pd.DataFrame({
'商品A売上': [100, 150, 80, 200],
'商品B売上': [120, 160, 90, 180],
'在庫数': [50, 30, 70, 40]
})
print("\n元のDataFrame:\n", df_data)
# 全数値列の平均値を計算
agg_result_df_single = df_data.agg('mean')
print("\nDataFrame全列の平均値:\n", agg_result_df_single)
2. DataFrameで複数列に異なる集計を適用する
agg()の真価は、DataFrameの異なる列に異なる集計関数を適用できる点にあります。
各列に単一の集計関数を適用(辞書形式)
列名をキー、適用したい集計関数(文字列)をバリューとする辞書をagg()に渡します。
# '商品A売上'は合計、'商品B売上'は最大値、'在庫数'は最小値
agg_result_dict = df_data.agg({
'商品A売上': 'sum',
'商品B売上': 'max',
'在庫数': 'min'
})
print("\nDataFrameの異なる列に異なる集計(単一関数):\n", agg_result_dict)
各列に複数の集計関数を適用(辞書形式とリストの組み合わせ)
最も柔軟な使い方で、列名をキー、その列に適用したい集計関数のリストをバリューとする辞書を渡します。
# '商品A売上'は合計と平均、'商品B売上'は最大値と最小値、'在庫数'は合計
agg_result_complex = df_data.agg({
'商品A売上': ['sum', 'mean'],
'商品B売上': ['max', 'min'],
'在庫数': 'sum' # 単一関数も指定可能
})
print("\nDataFrameの異なる列に異なる集計(複数関数):\n", agg_result_complex)
解説:
-
df_data.agg({...}): キーに列名、バリューに集計関数(文字列または文字列のリスト)を指定します。 -
結果はDataFrameとして返され、行インデックスが集計関数の名前、列インデックスが元のDataFrameの列名となります。
カスタム関数を適用する
ラムダ式や自分で定義した関数もagg()に渡すことができます。
# 各商品の売上合計に10%のボーナスを加算するカスタム関数
def add_bonus(x):
return x.sum() * 1.1
agg_custom = df_data.agg({
'商品A売上': add_bonus,
'商品B売上': ['sum', lambda x: x.std()] # 標準偏差も計算
})
print("\nカスタム関数とラムダ式を使った集計:\n", agg_custom)
3. groupby()とagg()の組み合わせ
groupby()とagg()を組み合わせることで、カテゴリごとの複雑な集計を効率的に行うことができます。
# サンプルDataFrameにカテゴリ列を追加
df_data_with_category = pd.DataFrame({
'カテゴリ': ['果物', '野菜', '果物', '野菜', '果物', '野菜'],
'売上': [100, 150, 80, 200, 120, 180],
'在庫': [50, 30, 70, 40, 60, 20]
})
print("\nカテゴリ付き元のDataFrame:\n", df_data_with_category)
# カテゴリごとに売上の合計と平均、在庫の最大値を計算
grouped_agg = df_data_with_category.groupby('カテゴリ').agg({
'売上': ['sum', 'mean'],
'在庫': 'max'
})
print("\nカテゴリごとの集計:\n", grouped_agg)
解説:
-
df_data_with_category.groupby('カテゴリ'):'カテゴリ'列でデータをグループ化します。 -
.agg(...): グループ化されたデータに対して、指定された集計関数を適用します。これにより、各カテゴリ('果物'、'野菜')ごとに売上の合計と平均、在庫の最大値が算出されます。
4. agg()とaggregate()の違いは?
agg()とaggregate()は全く同じメソッドです。 agg()はaggregate()のより簡潔なエイリアス(別名)として提供されています。どちらを使っても機能的な違いはありませんが、一般的には入力が短くて済むagg()が使われることが多いです。
まとめ
Pandasのagg()(aggregate())メソッドは、DataFrameやSeriesのデータに対して複数の集計関数を一度に適用するための非常に強力で柔軟なツールです。単一のSeriesから複数の統計量を取得したり、DataFrameの異なる列に異なる集計を適用したり、さらにはgroupby()と組み合わせて複雑なグループ集計を行ったりと、データ分析の多様なニーズに対応できます。
-
基本: リストや辞書形式で集計関数を渡す。
-
柔軟性: 列ごとに異なる関数、複数の関数、カスタム関数を適用可能。
-
強力な組み合わせ:
groupby()と連携することで、複雑なグループ集計が容易に。 -
効率: コードの簡潔化と処理速度の向上に貢献。
これらの機能を使いこなすことで、データ探索、集計、レポート作成のプロセスが大幅に効率化され、あなたのデータ分析スキルはさらに向上するでしょう。ぜひagg()メソッドを積極的に活用してみてください。
