Pythonのデータ分析ライブラリpandasのgroupby オブジェクトに使う transform と apply の違いについて、整理したいと思います。ドキュメンテーションなんでちゃんと書いてないねん!
書く際には以下のstack overflowのサイトを参考にしています。
https://stackoverflow.com/questions/27517425/apply-vs-transform-on-a-group-object
下のデータを使っていきます。
import pandas as pd
import numpy as np
df = pd.DataFrame({'Year': [1997, 1997, 1997, 1998, 1999],
'Japan': [100, 100, 300, 200, 100],
'USA': [200, 100, 300, 400, 500],
'Canada': [400, 300, 200, 100, 400]},
index=['1', '2', '3', '4', '5'])
df
Out:
Year | Japan | USA | Canada | |
---|---|---|---|---|
1 | 1997 | 100 | 200 | 400 |
2 | 1997 | 100 | 100 | 300 |
3 | 1997 | 300 | 300 | 200 |
4 | 1998 | 200 | 400 | 100 |
5 | 1999 | 100 | 500 | 400 |
Pandas の groupby オブジェクトに使う apply
イメージとしては、グループされたものをグループごとに圧縮してしまう感じ。
import numpy as np
df.groupby('Year').apply(np.sum).drop('Year', axis=1)
Japan | USA | Canada | |
---|---|---|---|
Year | |||
1997 | 500 | 600 | 900 |
1998 | 200 | 400 | 100 |
1999 | 100 | 500 | 400 |
5行あったのが3行に圧縮されたのがわかると思います。
#Pandas の groupby オブジェクトに使う transform
イメージとしては、グループされたものにグループ内の要素分に情報を一個ずつ足す感じ。
df.groupby('Year').transform(np.sum)
df
Japan | USA | Canada | |
---|---|---|---|
1 | 500 | 600 | 900 |
2 | 500 | 600 | 900 |
3 | 500 | 600 | 900 |
4 | 200 | 400 | 100 |
5 | 100 | 500 | 400 |
1行目、2行目、3行目は全て同じ合計となり、applyのように圧縮されない。
なので下のように列をもとのgroupbyする前のデータフレームに足すことも可能です。
df['Canada Yearly Sum'] = df.groupby('Year').transform(np.sum)['Canada']
df
Year | Japan | USA | Canada | Canada Yearly Sum | |
---|---|---|---|---|---|
1 | 1997 | 100 | 200 | 400 | 900 |
2 | 1997 | 100 | 100 | 300 | 900 |
3 | 1997 | 300 | 300 | 200 | 900 |
4 | 1998 | 200 | 400 | 100 | 100 |
5 | 1999 | 100 | 500 | 400 | 400 |
データフレームは圧縮されないのでこのようにデータフレームに値を1行ずつ足して行くことも可能
#終わりに
transform, apply ともにうまくやれば頭良く問題を解決できそうですね。これからもちょっとこの二つのアルゴリズムで試行錯誤していこうと思います。