본문 바로가기

Programming/Etc

[Pandas] shift란?

728x90
반응형

Pandas에서 제공하는 기능 중 shift라는 기능이 있다.

우리가 알고 있는 의미 그대로 '이동시키다'라고 해석하면 어떤 기능인지 잘 와닿을 것 같다!

 

말 그대로 현재 데이터를 n칸 씩 앞으로 또는 뒤로 손쉽게 밀 수 있다.

공식 문서에 있는 예제를 살펴보자.

아래와 같은 예시의 데이터 프레임이 있을 때

 

>>> df = pd.DataFrame({"Col1": [10, 20, 15, 30, 45],
...                    "Col2": [13, 23, 18, 33, 48],
...                    "Col3": [17, 27, 22, 37, 52]},
...                   index=pd.date_range("2020-01-01", "2020-01-05"))
>>> df
            Col1  Col2  Col3
2020-01-01    10    13    17
2020-01-02    20    23    27
2020-01-03    15    18    22
2020-01-04    30    33    37
2020-01-05    45    48    52

 

shift 3을 해주면 세 칸씩 데이터를 이동시킬 수 있다. 

이동 시켰을 때 들어올 값이 없는 부분은 NaN으로 채워지게 된다.

음수 값을 주면 반대 방향으로 이동시키는 것도 가능하다.

 

>>> df.shift(periods=3)
            Col1  Col2  Col3
2020-01-01   NaN   NaN   NaN
2020-01-02   NaN   NaN   NaN
2020-01-03   NaN   NaN   NaN
2020-01-04  10.0  13.0  17.0
2020-01-05  20.0  23.0  27.0

 

만약 NaN으로 채워지는 것이 맘에 들지 않는다면 fill_value라는 속성을 통해 어떤 값으로 채울지 설정해줄 수도 있다.

 

>>> df.shift(periods=3, fill_value=0)
            Col1  Col2  Col3
2020-01-01     0     0     0
2020-01-02     0     0     0
2020-01-03     0     0     0
2020-01-04    10    13    17
2020-01-05    20    23    27

 

아래와 같이 축을 설정하여 row가 아니라 column 방향으로 데이터를 이동시키는 것 또한 가능하다.

 

>>> df.shift(periods=1, axis="columns")
            Col1  Col2  Col3
2020-01-01   NaN    10    13
2020-01-02   NaN    20    23
2020-01-03   NaN    15    18
2020-01-04   NaN    30    33
2020-01-05   NaN    45    48

 

물론 전체 테이블이 아니라 특정 속성에 대해서만 shift하는 것도 가능하다!

 

또한 groupby를 해주면 특정 속성에 관련한 데이터들에 한해서만 shift도 가능하다!

 

이를 활용하면 좀 더 간다하면서도 쉽게 다양한 feature engineering이 가능할 것이다.

가령 과거의 데이터를 기반으로 현재 데이터를 예측하기 위한 feature를 생성하는 것이 대표적인 예시일 것 같다.

 

 

 

 

pandas.DataFrame.shift — pandas 1.4.2 documentation

The scalar value to use for newly introduced missing values. the default depends on the dtype of self. For numeric data, np.nan is used. For datetime, timedelta, or period data, etc. NaT is used. For extension dtypes, self.dtype.na_value is used. Changed i

pandas.pydata.org

 

728x90
반응형