[Python]다중 조건으로 데이터 프레임 특정 행 추출하기(데이터 프레임 필터링)
0. 서론
데이터 전처리, 분석 등에서 가장 많이 사용되는 기능 중 하나로는 데이터프레임에서 특정 행을 추출하는 필터링이 있다.
많은 수업 및 블로그들에서 loc 등을 통한 필터링을 알려주고 있지만 다중 조건에 대한 내용은 잘 나오지 않는다.
실제 분석 업무에서는 여러가지 조건을 중첩하여 사용하게 되는데, 이에대한 간단한 실험과 효율적 방법에 대해서 포스팅해본다.
1. 데이터 준비
실험 및 예시에서 사용될 데이터는 seaborn에서 제공하는 "taxis" 샘플을 사용한다.
14개의 컬럼으로 구성되어 있으며 여러 타입의 데이터가 존재한다.
import seaborn as sns
df = sns.load_dataset('taxis')
df.info()
seaborn에서 제공하는 데이터 셈플에 대한 자세한 내용은 다음 글에서 확인 할 수 있다.
https://csshark.tistory.com/54
파이썬 데이터 샘플 불러오기 seaborn.load_dataset (titanic 외 18)
데이터 분석 또는 시각화를 연습하거나 예시를 들때 그 재료가될 데이터가 필요하다. seaborn 라이브러리에서는 이럴 때 사용할 수 있는 데이터를 간편하게 제공하고 있다. 기본적으로 19개의 csv
csshark.tistory.com
2. 단일 조건을 통한 데이터 프레임 특정 행 추출
어떠한 조건에 의한 특정 행 추출은 {DataFrame}.loc[조건 , 행(컬럼)]으로 수행 할 수 있다.
이에 대한 내용은 다양한 블로그에서 잘 다루고 있으니 간단한 예시 두가지만 보이고 넘어간다.
3. 다중 조건을 통한 데이터 프레임 특정 행 추출
앞선 예시에서 df.tip < 1 부분을 통해서 "tip"컬럼의 값이 1보다 작은 이라는 조건을 제시하였다.
해당 조건을 만족시키면서 추가적으로 "color" 컬럼의 값이 yellow인 행을 추출하려면 아래의 조건문으로 수행 할 수 있다.
& 연산자를 통해서 다중 조건을 사용하고 있다.
그럼 df.tip < 1, df.color == yellow, 그리고 (df.tip < 1)&(df.color == yellow)은 어떠한 의미를 가지는 것일까?
정답은 bool 타입의 리스트를 반환한다.
& 연산을 통해 생성된 최종 bool타입의 리스트를 통해 데이터프레임의 각 행을 가져올지 버릴지 선택하게 되는 것이다.
4. 효과적인 다중 조건 데이터프레임 특정 행 추출을 위해서는?
그렇다면 실제로 어떻게 사용하는 것이 효과적일까?
간단한 실행속도 비교 실험을 첨부하며 글을 마친다.
import time
import pandas as pd
import seaborn as sns
# 데이터 로드
df = sns.load_dataset('taxis')
# 실험을 위한 데이터 증강
dummy_df = pd.concat([df for i in range(5000)])
##### case1 #####
# 실제로 자주 보이는 방식
s_time = time.time()
tmp_df = dummy_df.copy()
tmp_df = tmp_df.loc[tmp_df.tip < 1]
tmp_df = tmp_df.loc[tmp_df.color == 'yellow']
tmp_df = tmp_df.loc[tmp_df.fare >= 10]
tmp_df = tmp_df.loc[tmp_df.fare < 25]
tmp_df = tmp_df.loc[tmp_df.passengers > 1]
tmp_df = tmp_df.loc[tmp_df.pickup_borough == 'Manhattan']
print("time :", time.time() - s_time)
##### case2 #####
# 다중 조건을 loc 내부에서 선언한 케이스
s_time = time.time()
tmp_df = dummy_df.copy()
tmp_df = tmp_df.loc[
(tmp_df.tip < 1)&
(tmp_df.color == 'yellow')&
(tmp_df.fare >= 10)&
(tmp_df.fare < 25)&
(tmp_df.passengers > 1)&
(tmp_df.pickup_borough == 'Manhattan')
]
print("time :", time.time() - s_time)
##### case3 #####
# 다중 조건을 외부에서 연산하여 loc에 적용하는 케이스
s_time = time.time()
tmp_df = dummy_df.copy()
condition = (
(tmp_df.tip < 1)&
(tmp_df.color == 'yellow')&
(tmp_df.fare >= 10)&
(tmp_df.fare < 25)&
(tmp_df.passengers > 1)&
(tmp_df.pickup_borough == 'Manhattan')
)
tmp_df = tmp_df.loc[condition]
print("time :", time.time() - s_time)