Pandas のGroupBy.first を使うと、グループの中で一番最初の値を取得できる。
以前SQLの分析関数であるFIRST_VALUEとの動きを確認した。Pandasでどのように実現していくのか見ていくものになる。
実行環境
今回は環境構築がいらないGoogle Colaboratoryを使った。
準備と確認
まずはPandasのインポートと、はじめに使用するデータを用意する。 データはFIRST_VALUE関数で確認したものと同じものにした。
import pandas as pd dict1=dict(position=['FW','FW','MF','MF','MF','MF','DF','DF','DF','DF','GK'], score=[10,5,4,3,3,2,3,2,1,0,0]) df1 = pd.DataFrame(data=dict1)
position score 0 FW 10 1 FW 5 2 MF 4 3 MF 3 4 MF 3 5 MF 2 6 DF 3 7 DF 2 8 DF 1 9 DF 0 10 GK 0
GroupBy.firstを実行する
そのままGroupBy.first
関数を実行し結果を確認する。
df1.groupby(['position'])['score'].first()
position DF 3 FW 10 GK 0 MF 4 Name: score, dtype: int64
グループ化された中で一番最初の値だけが戻り値となっている。 SQLはデータの集合に対して関数を適用し、列を返していたがPandasでは該当の値だけが返ってくる。
ドキュメントにも
Returns Series or DataFrame Computed first of values within each group.
戻り値 系列またはデータフレーム 各グループ内の値の最初の値を計算します。
と書かれていて、動きとしては間違っていないことがわかる。
GroupBy.first関数の値を元のデータフレームに戻してみる
取り出した最初の値を、データフレームにし、カラム名も付与する。
first_score_df = df1.groupby(["position"]).first().reset_index() first_score_df.columns = ["position", "first_score"] first_score_df
その後、Pandasのmergeでデータフレーム同士をinner joinで結合すれば完成する。
pd.merge(df1, first_score_df, on="position")
position score first_score 0 FW 10 10 1 FW 5 10 2 MF 4 4 3 MF 3 4 4 MF 3 4 5 MF 2 4 6 DF 3 3 7 DF 2 3 8 DF 1 3 9 DF 0 3 10 GK 0 0
まとめ
GroupBy.first関数を使いながら動きを確認できた。 LAST_VALUE 関数のように使いたい場合はGroupBy.lastを使うと逆の動きになってくれる。