pandasでrollingしたときにcolumnが重複。
まるでルー語のような出だしだが、Pythonユーザーだったら1回くらいは躓いた事があるかもしれない。
今回はpandasで rolling
を使う際のちょっとした注意点を記述する。
rollingって?
直近X回分のデータの平均値や最大値といった集合の一部を集計することができる窓関数の機能。
株価の例だと移動平均を取得するのに使われる。
pandas.DataFrame.rolling — pandas 0.24.0 documentation
使い方
まず集計する対象のデータを準備する。
コード1(前準備)
import pandas as pd x = pd.DataFrame([["A",1],["B",2],["C",3],["D",4],["E",5],["F",6],["G",7]],columns=["Col1","Col2"]) print(x) print(type(x))
表示
Col1 Col2 0 A 1 1 B 2 2 C 3 3 D 4 4 E 5 5 F 6 6 G 7 class 'pandas.core.frame.DataFrame'
そして .rolling(window=(集計する範囲)).mean()
で移動平均を取得する。
コード2(移動平均)
ma = x["Col2"].rolling(window=4).mean() print(ma) print(type(ma))
表示
0 NaN 1 NaN 2 NaN 3 2.5 4 3.5 5 4.5 6 5.5 Name: Col2, dtype: float64 class 'pandas.core.series.Series'
[注意] 移動平均をconcatで結合するとカラム名が重複する
下のコード例のように、concatで結合するとカラム「Col2」が2個になってしまう。
ちなみに rolling
で作成された移動平均は DataFrame型
ではなく Series型
なのでrenameでは対処不可。
コード3(concat結合)
x_ma = pd.concat([x,ma], axis=1) print(x_ma)
表示
Col1 Col2 Col2 0 A 1 NaN 1 B 2 NaN 2 C 3 NaN 3 D 4 2.5 4 E 5 3.5 5 F 6 4.5 6 G 7 5.5
移動平均を結合するなら別カラム名を定義して挿入
下のコード例のように、元となるDataFrameに別カラムを定義して挿入してしまえば別のカラム名を使って移動平均を格納できる。
コード4(別カラムに挿入)
x["ma"] = x["Col2"].rolling(window=4).mean() print(x)
表示
Col1 Col2 ma 0 A 1 NaN 1 B 2 NaN 2 C 3 NaN 3 D 4 2.5 4 E 5 3.5 5 F 6 4.5 6 G 7 5.5