めも

メモ.

pandas.DataFrameでデータの列・行をひとつずらす

やりたいこと

時系列データや順序つきのデータで、直前の時間のデータを特徴として追加したいときがある。

方法

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