agg()メソッド
agg()を使って複数の集計関数を一度に適用し、dictを渡して列ごとに異なる統計量を計算します。
「agg()メソッド」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
agg()を使う理由
GroupByオブジェクトでsum()やmean()を直接呼び出すと、1つの統計量だけが得られます。しかし実際の分析では、地域ごとの売上合計、平均注文額、注文数のように、複数の統計量を一度に必要とすることがよくあります。agg()メソッド(aggregateの略)を使うと、集計を個別に実行して結果を結合するのではなく、これらをすべて1回の効率的な呼び出しで計算できます。
関数名のリストの指定
agg()の最も簡単な使い方は、関数名を表す文字列のリストを渡すことです。Pandasは選択した列に各関数を適用し、関数ごとに1列を持つDataFrameを返します。この方法では、'sum'、'mean'、'min'、'max'、'count'、'std'、'median'など、組み込み集計の名前を利用できます。
import pandas as pd
df = pd.DataFrame({
'region': ['East', 'West', 'East', 'West', 'East', 'West'],
'revenue': [200, 340, 150, 290, 310, 410],
'units': [20, 35, 15, 30, 28, 40]
})
result = df.groupby('region')['revenue'].agg(['sum', 'mean', 'count', 'max'])
print(result)
# sum mean count max
# region
# East 660 220.000000 3 310
# West 1040 346.666667 3 410名前付き集計による出力列名の変更
文字列のリストを渡すと、出力列には関数そのものの名前('sum'、'mean'など)が付けられます。より分かりやすい出力にするには、名前付き集計を使用します。キーを付けたい列名、値を(column, function)のタプルとするキーワード引数を渡してください。これは現在のPandasで推奨される方法で、コードの内容が名前から分かるようになります。
result = df.groupby('region').agg(
total_revenue=('revenue', 'sum'),
avg_revenue=('revenue', 'mean'),
order_count=('revenue', 'count'),
max_order=('revenue', 'max')
)
print(result)
# total_revenue avg_revenue order_count max_order
# region
# East 660 220.000000 3 310
# West 1040 346.666667 3 410列ごとに異なる関数を使用する
agg()に辞書を渡すことができます。辞書の各キーは列名、各値はその列に適用する関数(または関数のリスト)です。これにより、1回のGroupBy呼び出しで、たとえばrevenueにはsumを、unitsにはmeanを適用できます。
result = df.groupby('region').agg({
'revenue': ['sum', 'mean'],
'units': ['sum', 'max']
})
print(result)
# revenue units
# sum mean sum max
# region
# East 660 220.000000 63 28
# West 1040 346.666667 105 40辞書agg()による列のMultiIndex
列ごとに複数の関数を指定した辞書を渡すと、結果の列にMultiIndexが作成されます。第1レベルは元の列名、第2レベルは関数名です。リスト内包表記を使うと、これらの列名を1つの文字列に平坦化でき、その後の処理がしやすくなります。
result = df.groupby('region').agg({'revenue': ['sum', 'mean'], 'units': 'sum'})
# Flatten MultiIndex columns
result.columns = ['_'.join(c).strip() for c in result.columns]
print(result.columns.tolist())
# ['revenue_sum', 'revenue_mean', 'units_sum']agg()でカスタム関数を使う
文字列の名前だけでなく、任意のPython callableをagg()に渡すこともできます。関数はSeries(あるグループ内のその列の値)を受け取り、スカラーを返す必要があります。ラムダ関数または名前付き関数を渡せます。カスタム関数は柔軟性が高い一方、Cレベルの最適化を利用できないため、組み込みの名前付き関数よりも低速です。
def revenue_range(s):
return s.max() - s.min()
result = df.groupby('region')['revenue'].agg(['sum', revenue_range])
print(result)
# sum revenue_range
# region
# East 660 160
# West 1040 120カスタム関数を使った名前付き集計
名前付き集約の構文は、文字列の名前だけでなく、呼び出し可能な関数にも使用できます。キーワード引数の値として、(column, function)のタプルを渡すだけです。ここで、関数はSeriesを受け取り、スカラーを返す任意の呼び出し可能オブジェクトです。組み込み関数と独自のロジックを組み合わせる場合でも、コードの読みやすさを保てます。
result = df.groupby('region').agg(
total=('revenue', 'sum'),
spread=('revenue', lambda s: s.max() - s.min()),
top_units=('units', 'max')
)
print(result)
# total spread top_units
# region
# East 660 160 28
# West 1040 120 40列を選択せずに集約する
特定の列を選択せずにGroupByに対してagg()を呼び出すと、PandasはDataFrame内のすべての数値列に関数を適用します。これは、すべての数値列を一度に集計する手軽な方法です。ほとんどの集約では、数値以外のデータ型を持つ列は警告なしにスキップされる点に注意してください。
# Aggregate all numeric columns in one call
result = df.groupby('region').agg(['sum', 'mean'])
print(result)
# revenue units
# sum mean sum mean
# region
# East 660 220.000000 63 21.00
# West 1040 346.666667 105 35.00agg()とreset_index()の組み合わせ
agg()の実行後、グループ化に使用した列はインデックスになります。よく使われるパターンは、直後にreset_index()を呼び出し、グループキーを通常の列として持つフラットなDataFrameに戻すことです。その後は、他のDataFrameと同じように結果の名前変更、並べ替え、絞り込みができるため、後続処理に渡したりエクスポートしたりしやすくなります。
summary = (
df.groupby('region')
.agg(total=('revenue', 'sum'), orders=('revenue', 'count'))
.reset_index()
.sort_values('total', ascending=False)
)
print(summary)
# region total orders
# 1 West 1040 3
# 0 East 660 3agg()とtransform()とapply()の違い
GroupByの3つのメソッドの違いを理解することが重要です。agg()は各グループをスカラーに集約するため、元のデータより行数の少ない結果を生成します。transform()は入力と同じ形状の配列を返すため、グループ単位の統計量を新しい列として追加できます。apply()は最も柔軟ですが、その分最も遅く、次のレッスンで扱います。
# agg: one row per group
print(df.groupby('region')['revenue'].agg('mean'))
# region
# East 220.0
# West 346.7
# transform: one row per original row (group mean broadcast back)
df['group_mean'] = df.groupby('region')['revenue'].transform('mean')
print(df[['region', 'revenue', 'group_mean']].head())実践例: 売上サマリー
ここでは、地域ごとに総売上、平均注文額、注文数、売上の範囲を計算し、列名をわかりやすく整えたうえで総売上の降順に並べる、実践的な一連の例を紹介します。このパターンは、プロダクト、財務、マーケティングの分析業務にそのまま応用できます。
summary = (
df.groupby('region')
.agg(
total_revenue=('revenue', 'sum'),
avg_order=('revenue', 'mean'),
num_orders=('revenue', 'count'),
revenue_range=('revenue', lambda s: s.max() - s.min())
)
.reset_index()
.sort_values('total_revenue', ascending=False)
.round(2)
)
print(summary)理解度チェック
このレッスンで学んだagg()メソッドの理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、agg()を使って複数の集約を一度に計算する方法、列名をわかりやすくするための名前付き集約、そして辞書を使って列ごとに異なる関数を適用する方法を学びました。次は、グループ単位の情報を元のDataFrameに追加するtransform()とfilter()について学びます。
よくある質問
「agg()メソッド」レッスンは無料ですか?
はい。「agg()メソッド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
「agg()メソッド」で何を学びますか?
agg()を使って複数の集計関数を一度に適用し、dictを渡して列ごとに異なる統計量を計算します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Pandas & NumPy Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「agg()メソッド」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPandas & NumPy Academyレッスンでコードを書いて実行できますか?
はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。