やりたいこと
時系列データや順序つきのデータで、直前の時間のデータを特徴として追加したいときがある。
方法
pandas.DataFrame.shift
を用いて簡単に実現できる。
import pandas as pd import numpy as np import matplotlib.pyplot as plt df = pd.DataFrame(np.random.randint(0, 100, [10, 5])) df.columns = ["col%s"%c for c in df.columns]
df
の中身は以下のようになっている。
col0 col1 col2 col3 col4 0 93 85 7 74 99 1 5 18 24 66 97 2 76 69 60 40 0 3 94 5 0 3 16 4 61 78 84 49 96 5 34 94 63 73 63 6 78 6 86 3 96 7 33 85 74 43 90 8 83 80 34 56 46 9 74 5 40 33 97
shiftを用いてデータを shift(n) の n
だけずらす。ずらした分データが存在しない場所には nan
が入るが、fill_value=-1
とすることでずらした箇所を -1
で埋めることもできる。
df["col1"] = df["col1"].shift(1) df["col2"] = df["col2"].shift(2, fill_value=-1) df["col3"] = df["col3"].shift(3, fill_value=False)
shiftでデータをずらした後の df
の中身は以下のようになる。
col0 col1 col2 col3 col4 0 93 NaN -1 False 99 1 5 85.0 -1 False 97 2 76 18.0 7 False 0 3 94 69.0 24 74 16 4 61 5.0 60 66 96 5 34 78.0 0 40 63 6 78 94.0 84 3 96 7 33 6.0 63 49 90 8 83 85.0 86 73 46 9 74 80.0 74 3 97