LoginSignup
1
1

More than 5 years have passed since last update.

pandas group_byとpct_changeの併用時bug (0.23.N)

Posted at

bugの内容

概要

pandasのpct_change関数をgroup byと共に使用する際に、group毎にpct_changeを区切って実行してくれないという事象が発生していた。(pandas 0.24.0で修正済み。)

何をしたかったのか

以下に参考用のテーブルを用意した。
このデータのValueのpct_changeをして、昨対比(MoM)を見たいという場面を想定。

Company Group Date Value
A X 2015-01 1
A X 2015-02 2
A X 2015-03 1.5
A XX 2015-01 1
A XX 2015-02 1.5
A XX 2015-03 0.75
A XX 2015-04 1
B Y 2015-01 1
B Y 2015-02 1.5
B Y 2015-03 2
B Y 2015-04 3
B YY 2015-01 2
B YY 2015-02 2.5
B YY 2015-03 3

Company, Group, Dateでgroup byをして、Valueのpct_changeを実施する。
df['Pct_change'] = df.sort_values('Date').groupby(['Company', 'Group']).Value.pct_change()

欲しかった結果

Company Group Date Value Pct_change
A X 2015-01 1 NaN
A X 2015-02 2 1
A X 2015-03 1.5 -0.25
A XX 2015-01 1 NaN
A XX 2015-02 1.5 0.5
A XX 2015-03 0.75 -0.5
A XX 2015-04 1 0.33
B Y 2015-01 1 NaN
B Y 2015-02 1.5 0.5
B Y 2015-03 2 0.33
B Y 2015-04 3 0.5
B YY 2015-01 2 NaN
B YY 2015-02 2.5 0.25
B YY 2015-03 3 0.2

実際に吐き出された結果

Company Group Date Value Pct_change
A X 2015-01 1 NaN
A X 2015-02 2 1
A X 2015-03 1.5 -0.25
A XX 2015-01 1 -0.33
A XX 2015-02 1.5 0.5
A XX 2015-03 0.75 -0.5
A XX 2015-04 1 0.33
B Y 2015-01 1 0
B Y 2015-02 1.5 0.5
B Y 2015-03 2 0.33
B Y 2015-04 3 0.5
B YY 2015-01 2 -0.33
B YY 2015-02 2.5 0.25
B YY 2015-03 3 0.2

要は、group_byの最初のrow(ex.4行目)のPct_changeカラムに-0.33と入ってしまう。
ここはgroupが違うので、NaNであるべきなのに。

解決方法

概要

pandasのversionを0.24.0にupしましょう。

sample

anaconda userはterminalを立ち上げて、以下のコマンドを打ちましょう。
conda install pandas=0.24.0

参考

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.pct_change.html
https://stackoverflow.com/questions/40273251/pandas-groupby-with-pct-change
https://github.com/pandas-dev/pandas/issues/21200

1
1
0

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
1
1