よっしーの私的空間

機械学習を中心に興味のあることについて更新します

Pandasでグループ毎に過去データを集約する方法

PythonのPandasを用いて、任意のカラム毎にグルーピングして、過去データを集約する方法についてまとめます。調べても意外と情報が少なくて苦戦しました。見つけても、複数カラムでグルーピングできなかったり、自信のデータを除外できなかったりと。これらの点も対応しているので、良ければ参考にしてください。

例が無いと分かりにくいので、以下のデータについて考えていきます。生徒毎に過去2年分の平均点数を算出する方法をまとめます。

結論ですが、以下で実施可能です。

import pandas as pd
# サンプルデータを作成する。
df = pd.DataFrame(
    [["A君","2020年","60"],
     ["B君","2020年","86"],
     ["C君","2020年","56"],
     ["A君","2021年","90"],
     ["B君","2021年","72"],
     ["C君","2021年","70"],
     ["A君","2022年","95"],
     ["B君","2022年","85"],
     ["C君","2022年","80"]],
    columns=["生徒","試験日","点数"]
)

# 集計する事前準備として、データを生徒毎に試験日で並び替える
df = df.groupby(['生徒']).apply(lambda x: x.sort_values(by=['試験日'], ascending=[True])).reset_index(drop=True)

# 過去2年分データを集計して、新カラム作成
df['過去2年の平均点数'] = pd.Series(
    df.groupby(['生徒'])['点数']\
    .apply(lambda v: v.shift(+1).rolling(2,min_periods=1).mean())
)

display(df.sort_values(by=['試験日','生徒']))

結果は以下の通りになります。想定通りですね。

もう少し解説していこうと思います。まずは並び替え部分について。

続いて、集計部分について。