agg():集約方法に辞書を指定

DataFrame.agg()では、列ごとに別の集約値を指定できます。次のように、引数で辞書を指定します。

df.agg(辞書)

辞書のキーには、列名を指定します。辞書の値には、これまで指定してきたような関数名や関数名のリストを指定します。

※ 辞書を渡す方法は、Series.agg()では使えません。

具体例で確認しましょう。前問と同じ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

WorkTimeでは平均、列LimitDateでは最小値と最大値を計算したい場合は、以下のようになります。
このような書き方は、列ごとに集約したい項目が異なるときに有効です。

df.agg({
    "WorkTime": "mean",
    "LimitDate": ["min", "max"]
})
WorkTimeLimitDate
mean1.7NaN
minNaN2022/04/01
maxNaN2022/04/11

WorkTimeの平均が、列LimitDateの最小値と最大値が確認できます。

演習

タスク一覧を読み込みます。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

集約用の関数を定義します。引数srはSeriesです。srの最大値から最小値を引いたものを返します。In [2]:

def diff(sr):
    return sr.max() - sr.min()

WorkTimeに適用します。agg()に関数をそのまま書きます。 最大値(4.0)から最小値(0.5)を引いた3.5が、結果になります。In [3]:

df.WorkTime.agg(diff)

Out[3]:

3.5

ちなみに、「最大値−最小値」は、下記のようにも計算できます。In [4]:

df.WorkTime.max() - df.WorkTime.min()

Out[4]:

3.5

引数に関数のリストを指定すると、結果がSeriesになり、結果の行名が関数名になります。In [5]:

df.WorkTime.agg([diff])

Out[5]:

diff    3.5
Name: WorkTime, dtype: float64

続いてDataFrame.agg()も確認しましょう。 関数diff()では引き算を使っているため、数値の列でしか使えません。ここでは、文字列の列でも使えるように、最大値を求めて文字列化する関数を適用してみましょう。In [6]:

def max_str(sr):
    return f"最大値は{sr.max()}"

df.agg(max_str)

Out[6]:

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

関数のリストを指定すると、結果はDataFrameになります。また、結果の行名が関数名になります。In [7]:

df.agg([max_str])

Out[7]:

TaskNameWorkTimeLimitDate
max_str最大値は資料XYZ確認最大値は4.0最大値は2022/04/11

コメント

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