본문 바로가기
데이터 분석/데이터 전처리

[Pandas] 26. shift를 이용하여 칼럼 값이 바뀌는 지점(행) 찾기

by 부자 꽁냥이 2022. 5. 20.

안녕하세요~ 꽁냥이에요. 언젠가 회사 동료분께서 특정 칼럼의 값이 바뀌는 행을 찾는 법을 물어보셔서 알게 된 내용이 있는데요. 여러분들에게도 공유하면 언제가 써먹을 수 있을 것 같아서 이번 포스팅을 준비했습니다.

 

특정 칼럼의 값이 바뀐다는 것은 다음과 같이 (시간 순으로 정렬된) 데이터가 주어졌을 때 특정 칼럼의 값이 이전과는 다른 값이 나타났다는 뜻입니다(빨간 박스).

 

pandas 칼럼 값이 바뀐 지점

이 경우 우리는 다음과 같이 3가지 경우에 대해서 바뀌는 행(지점)을 추출하는 방법을 알아볼 것입니다.


   Case 1) 변경 직후

먼저 데이터를 만들어줍니다.

 

import pandas as pd

df = pd.DataFrame()
df['방문 시간'] = pd.date_range('2022-01-01', '2022-01-07')
df['장소'] = ['서울', '서울', '경기', '경기', '경기', '대전', '대전']

 

변경 직후는 첫 번째 행을 포함시키고 그 뒤로 특정 칼럼의 값 변경 직후의 행을 추출합니다. 방법은 쉽습니다. 아래 그림과 같이 '장소' 칼럼을 shift를 이용하여 아래로 한칸 내리고 원래의 '장소' 칼럼과 비교하고 그중에서 서로 다른 행을 가져오면 됩니다.

pandas shift 사용

코드는 다음과 같아요.

 

df[df['장소'] != df['장소'].shift(1)]

 


   Case 2) 변경 직전

눈치가 빠르신 분들은 아셨을 겁니다. shift를 이용해서 위로 땡겨서 원래의 칼럼과 비교한 뒤 같지 않은 행을 추출하면 됩니다.

 

pandas shift 이용

코드는 다음과 같습니다.

 

df[df['장소'] != df['장소'].shift(-1)]

 


   Case 3) 인접 부분

이 부분은 shift가 아닌 for 문을 이용하여 구현할 수 있습니다. 데이터의 모든 행을 돌면서 현재 행의 장소와 다음 행의 장소가 다르면 현재 행, 다음 행 인덱스를 저장합니다.

 

target_idx = []
for i, row in df.iterrows():
    if i<len(df)-1:
        if row['장소'] != df.loc[i+1, '장소']:
            target_idx += [i, i+1]
            
df.loc[target_idx, ]

 


이번 포스팅에서는 shift를 사용하여 특정 칼럼의 값이 변경되는 행을 추출하는 방법에 대하여 알아 보았습니다. 회사 동료가 물어본 것은 Case 2 변경 직전에 대한 행을 추출하는 방법이었는데요. 하는 김에 여러 케이스를 더 조사하여 내용에 추가하였습니다. 이번 포스팅은 은근 자주 써먹는 테크닉이라서 알아두시면 도움이 됩니다. 지금까지 꽁냥이의 글 읽어주셔서 감사합니다.


댓글


맨 위로