DataFrame.agg()
では、列ごとに別の集約値を指定できます。次のように、引数で辞書を指定します。
df.agg(辞書)
辞書のキーには、列名を指定します。辞書の値には、これまで指定してきたような関数名や関数名のリストを指定します。
※ 辞書を渡す方法は、Series.agg()
では使えません。
具体例で確認しましょう。前問と同じdf
を使います。
TaskName | WorkTime | LimitDate | |
---|---|---|---|
0 | 資料ABC確認 | 1.5 | 2022-04-11 |
1 | 資料XYZ確認 | 0.5 | 2022-04-01 |
2 | 報告書まとめ | 1.5 | 2022-04-05 |
3 | 本社ミーティング | 4.0 | 2022-04-04 |
4 | 出張報告書の提出 | 1.0 | 2022-04-05 |
列WorkTime
では平均、列LimitDate
では最小値と最大値を計算したい場合は、以下のようになります。
このような書き方は、列ごとに集約したい項目が異なるときに有効です。
df.agg({
"WorkTime": "mean",
"LimitDate": ["min", "max"]
})
WorkTime | LimitDate | |
---|---|---|
mean | 1.7 | NaN |
min | NaN | 2022/04/01 |
max | NaN | 2022/04/11 |
列WorkTime
の平均が、列LimitDate
の最小値と最大値が確認できます。
演習
タスク一覧を読み込みます。In [1]:
import pandas as pd df = pd.read_csv("dataset/task.csv", encoding="utf-8") df
Out[1]:
TaskName | WorkTime | LimitDate | |
---|---|---|---|
0 | 資料ABC確認 | 1.5 | 2022/04/11 |
1 | 資料XYZ確認 | 0.5 | 2022/04/01 |
2 | 報告書まとめ | 1.5 | 2022/04/05 |
3 | 本社ミーティング | 4.0 | 2022/04/04 |
4 | 出張報告書の提出 | 1.0 | 2022/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]:
TaskName | WorkTime | LimitDate | |
---|---|---|---|
max_str | 最大値は資料XYZ確認 | 最大値は4.0 | 最大値は2022/04/11 |
コメント