LoginSignup
80
42

More than 5 years have passed since last update.

Pandas の transform と apply の基本的な違い

Last updated at Posted at 2019-05-09

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 ともにうまくやれば頭良く問題を解決できそうですね。これからもちょっとこの二つのアルゴリズムで試行錯誤していこうと思います。

80
42
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
80
42