-
[Python]다중 조건으로 데이터 프레임 특정 행 추출하기(데이터 프레임 필터링)Data Science/Pandas & Numpy&Scikit-learn 2022. 5. 10. 22:46반응형
0. 서론
데이터 전처리, 분석 등에서 가장 많이 사용되는 기능 중 하나로는 데이터프레임에서 특정 행을 추출하는 필터링이 있다.
많은 수업 및 블로그들에서 loc 등을 통한 필터링을 알려주고 있지만 다중 조건에 대한 내용은 잘 나오지 않는다.
실제 분석 업무에서는 여러가지 조건을 중첩하여 사용하게 되는데, 이에대한 간단한 실험과 효율적 방법에 대해서 포스팅해본다.
1. 데이터 준비
실험 및 예시에서 사용될 데이터는 seaborn에서 제공하는 "taxis" 샘플을 사용한다.
14개의 컬럼으로 구성되어 있으며 여러 타입의 데이터가 존재한다.
import seaborn as sns df = sns.load_dataset('taxis') df.info()
seaborn에서 제공하는 데이터 셈플에 대한 자세한 내용은 다음 글에서 확인 할 수 있다.
https://csshark.tistory.com/54
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)
반응형'Data Science > Pandas & Numpy&Scikit-learn' 카테고리의 다른 글
[Pandas] Pandas를 통한 데이터 전처리 (0) 2022.09.13 회귀모델에서 타겟(y)값의 정규화 방법 비교 실험 (0) 2022.05.27 [정규화,sklearn] MinMaxScaler, StandardScaler, RobustScaler (0) 2021.09.14 [인코딩,sklearn] Ordinal Encoding (0) 2021.09.14 [인코딩,sklearn] One-Hot Encoding (0) 2021.09.14