agg():データの集約

agg()は、次のようにして使います。

df.agg(func=集約に使う関数, axis=計算の軸)

引数の説明

  • func:集約に使う関数を指定します。
  • axis:処理の方向を指定します。0がインデックスで列ごとの集約になり、1が列名一覧で行ごとの集約になります。

また、agg()メソッドは、Seriesでも使えます。その場合、引数axisは指定不要です。

引数funcには、関数名や関数を指定するなど、いろいろな方法があります。詳しくは以降で確認しますが、本問ではまず、関数名を指定する方法について学びます。例として、"min""max""sum"を扱います。

また、引数funcは第1引数なので、以降ではdf.agg(func=関数の指定)ではなく、単にdf.agg(関数の指定)と書いています。

DataFrame.agg()では、axisによってfuncで指定される関数に渡される引数が変わります。

  • axis=0の場合:funcの引数には、列が渡されます。
  • axis=1の場合:funcの引数には、行が渡されます。

axis=0と指定するとインデックスに沿って計算するので、結果は列ごとになります。
axis=1と指定すると列名一覧に沿って計算するので、結果は行ごとになります。

下図は、デフォルト(axis=0)とaxis=1の計算する方向の違いを示しています。
図の矢印に沿って最大値である黄色い背景の値を取得しています。

https://images.pyq.jp/repo/prod/pandas_check_agg_v2/pandas_check_3.jpg

具体例で確認しましょう。

タスクの一覧を表す以下のdfを使います。

TaskNameWorkTimeLimitDate
0資料ABC確認1.52022-04-11
1資料XYZ確認0.52022-04-01
2報告書まとめ1.52022-04-05
3本社ミーティング4.02022-04-04
4出張報告書の提出1.02022-04-05

最大値はmax()で求められるので、以下のように関数名"max"を指定しすると各列の最大値を取得できます。
なお、文字列の最大値とは、文字列を辞書順に並べて最後になる値を指します。

df.agg("max")

実行結果

TaskName        資料XYZ確認
WorkTime            4.0
LimitDate    2022/04/11
dtype: object

また、列WorkTimeの最大値は次のようになります。

df.WorkTime.agg("max")

実行結果

4.0

演習

タスク一覧を読み込みます。In [1]:

import pandas as pd

df = pd.read_csv("dataset/task.csv", encoding="utf-8")
df

Out[1]:

TaskNameWorkTimeLimitDate
0資料ABC確認1.52022/04/11
1資料XYZ確認0.52022/04/01
2報告書まとめ1.52022/04/05
3本社ミーティング4.02022/04/04
4出張報告書の提出1.02022/04/05

列ごとに最小値を計算します。最小値の計算では、第1引数に”min”を指定します。 また、列ごとに計算する場合は、インデックスに沿って計算するので引数axisに0を指定します。axis=0はデフォルト値なので、下記では省略しています。In [2]:

df.agg("min")

Out[2]:

TaskName       出張報告書の提出
WorkTime            0.5
LimitDate    2022/04/01
dtype: object

列ごとに最大値を計算します。最大値の計算には”max”を指定します。In [3]:

df.agg("max")

Out[3]:

TaskName        資料XYZ確認
WorkTime            4.0
LimitDate    2022/04/11
dtype: object

axis=1をつけると、行ごとに集約します。dfを転置したデータで確認してみましょう。次のようにTを使うとデータが転置し、行と列が入れ替わります。In [4]:

df.T

Out[4]:

01234
TaskName資料ABC確認資料XYZ確認報告書まとめ本社ミーティング出張報告書の提出
WorkTime1.50.51.54.01.0
LimitDate2022/04/112022/04/012022/04/052022/04/042022/04/05

転置したdfaxis=1をつけて行ごとに集約すると、元のdfを列ごとに集約した結果と同じになります(解説で図で説明しています)。In [5]:

df.T.agg("max", axis=1)

Out[5]:

TaskName        資料XYZ確認
WorkTime            4.0
LimitDate    2022/04/11
dtype: object

agg()は、Seriesも同様に使えます。下記では列WorkTimeの最大値を計算します。In [6]:

df.WorkTime.agg("max")

Out[6]:

4.0

合計を計算するには”sum”を指定します。下記では列WorkTimeの合計を計算します。In [7]:

df.WorkTime.agg("sum")

Out[7]:

8.5

補足

本問では、agg()に関数名を指定する方法で集約を行いました。
agg()では、関数名ではなく関数そのものを指定することもできます。実際に確認してみましょう。

"min"を例にします。対応する関数はpd.DataFrame.minです。
下記を実行するとdf.agg("min")と同じ結果になります。

df.agg(pd.DataFrame.min)

コメント

タイトルとURLをコピーしました