1. 慣れるまで混乱しがちなAggregation

データ分析ではAggregationは多用します。

ただ慣れない頃はAggregation処理の記法について混乱します。

この記事では混乱の元を整理します。

また、Named Aggregationという使い勝手の良い記法をご紹介します。

2. 混乱の元

pandasのaggには混乱の元が幾つか存在します。

2.1. 3種類のagg

pandasには3種類のaggが存在します。

DataFrame.aggとSeries.aggは使い方が同じですが、groupby.aggの使い方は異なります。

そして、groupby.aggのほうが他の2つのaggより高機能で便利です。

3種類のaggと異なる使い方が混乱の元の一つとなります。

2.2. ドキュメントがイマイチ

pandas.core.groupby.GroupBy.aggのドキュメントですが詳細な説明がありません。

ドキュメントの整備が間に合っていないのでしょうか?

2.3. pandasのバージョンによってできることが異なる。

プログラミング言語では当然のことですがバージョンによってできることが異なります。

そのなかでもaggは機能改善が進んでいて枯れた技術ではなさそうなのでバージョンによってできることが大きく異なる印象です。

あとでご紹介するNamed Aggregationもバージョン0.25から使用できるようになった機能です。

2.4. Named Aggregationの情報が少ない

比較的新しい機能だからか検索しても情報が多くありません。

そもそもNamed Aggregationという用語にたどり着くのも難しいです。

Named Aggregationは便利な記法なのでもっと情報量が増えてほしいです。

3. Named Aggregation

Named Aggregationはユーザガイドで説明されています。

詳細は上記ドキュメントを読めば把握できますが

変数名=("集計対象の変数名", "集計関数")

という記法となります。

集計対象の変数と集計関数の組み合わせを指定する方法として自由度が高いので便利です。

とても便利なので私は今後この記法をメインにAggregation処理を実装していきます。

4. 実例

コードで実例をご紹介します。

4.1. データ準備

seabornのtitanicデータを使用します。

example.py
import pandas as pd
import seaborn as sns


titanic = sns.load_dataset('titanic')

4.2. 集計内容

alive別に幾つかの集計を試してみます。

  1. age count

  2. age mean

  3. fare count

  4. fare sum

  5. fare mean

4.3. 集計のコード

実際にNamed Aggregationを使用して集計してみます。

集計結果が横に長くなると確認しにくいので最後に.Tで転置しています。

example.py
agged = (
    titanic
    .groupby('alive')
    .agg(
        age_count=('age', 'count'),
        age_mean=('age', 'mean'),
        fare_count=('fare', 'count'),
        fare_sum=('fare', 'sum'),
        fare_mean=('fare', 'mean'),
    )
    .T
)
agged
output
alive                 no           yes
age_count     424.000000    290.000000
age_mean       30.626179     28.343690
fare_count    549.000000    342.000000
fare_sum    12142.719900  16551.229400
fare_mean      22.117887     48.395408

5. まとめ

pandasのaggとNamed Aggregationについて整理しました。

Named Aggregationがとても便利なので今後はこの記法をメインで使用していきます。

逆に言えばDataFrame.aggは機能が少ないのでできるだけ使用しません。

私はたとえgroupbyが必要ない集計の場合でも無理やりgroupbyしてnamed aggregationを使用しています。

by変数がない場合は単一値の新規変数を作成して無理やりgroupbyしています。

今回は以上です。