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=['試験日','生徒']))
結果は以下の通りになります。想定通りですね。
もう少し解説していこうと思います。まずは並び替え部分について。
続いて、集計部分について。