-
[Pandas] 데이터프레임 필터링, 특정 조건에 맞는 행/열 추출하기 (DataFrame.loc[])Data Science/Pandas & Numpy&Scikit-learn 2022. 10. 2. 18:24반응형
이번 글에서는 데이터프레임에서 원하는 조건들을 적용해서 원하는 행 또는 열을 추출하는 방법을 작성한다.
Pandas에서 데이터프레임 필터링 방법은 여러가지가 있지만 해당글에서는 loc만을 다룬다.
1. 데이터 준비
seaborn 라이브러리에서 제공하는 taxis 데이터셋을 사용한다.
(참고 : sns.load_dataset, 파이썬 데이터샘플 불러오기)
import seaborn as sns df = sns.load_dataset('taxis') print(df) print(df.info())
2. Pandas DataFrame.loc[] 사용법
가장 기본이 되는 문법은 DataFrame.loc[ 행조건 , 열조건 ] 이다.
행조건에는 index 또는 bool 타입의 리스트가 사용된다.
열조건에는 컬럼 이름이 사용된다.
import pandas as pd
# 행 : 인덱스 4~6번 # 열 : pickup, color 컬럼 df.loc[4:6, ['pickup','color']]
{시작포인트}:{종료포인트} 형식에서 특정 구간이 생략되면 시작/종료 지점으로 설정된다.
# 행 : 시작부터 4번까지 # 열 : payment부터 끝까지 df.loc[:4, 'payment':]
아래와 같이 한개의 컬럼만을 지정할 경우 데이터프레임(pandas.core.frame.DataFrame) 형식이 아닌 시리즈(pandas.core.series.Series) 형식을 반환한다.
한개의 컬럼에 대해서 데이터프레임 형식으로 뽑고싶을 때는 대괄호([])를 씌워주면 된다.
# 행 : 전체 # 열 : payment 컬럼 df.loc[:,'payment']
df.loc[:,['payment']]
3. 조건을 통한 행 지정하기(데이터프레임 필터링)
단순히 인덱스로 행을 지정하는 것 외에 조건을 통해서 행을 지정할 수 있다.
# 행 : tip컬럼의 값이 1미만인 경우 # 열 : tip, payment, pickup_zone 컬럼 df.loc[df.tip < 1, ['tip','payment','pickup_zone']]
그럼 과연 df.tip < 1은 어떠한 형태를 지니는 것일까?
print(df.tip < 1)
위 그림과 같이 각 인덱스에 조건 해당하면 True 해당하지 않으면 False를 가진다.
따라서 df.loc[df.tip < 1, : ]는 df.tip < 1 조건을 만족하는 행(True)에 대해서 반환한다.
4. 다중 조건을 통한 행 지정하기(다중조건 데이터프레임 필터링)
한개의 조건이 아닌, 두개 이상의 조건을 통한 행 지정도 가능하다.
# 행 : tip컬럼의 값이 1미만이고 payment 컬럼의 값이 cash가 아닌 행 # 열 : tip, payment, pickup_zone 컬럼 df.loc[(df.tip < 1) & ~(df.payment=='cash'), ['tip','payment','pickup_zone']]
결국 데이터프레임의 행 조건에는 bool 타입의 리스트가 들어가면 되는 것으로, 해당 값을 외부 변수로 만들고 사용해도 된다.
condition = (df.tip < 1) & ~(df.payment=='cash') df.loc[condition, ['tip','payment','pickup_zone']]
5. 조건을 여러 열(컬럼)에 적용하기
위와는 반대로 한가지의 조건을 여러 열(컬럼)에 적용하기도 한다.
ex : 센싱되는 값이 음수가 나올 수 없지만 에러로 인해서 음수값이 포함된 경우, 음수가 포함된 행은 삭제
예시를 위한 가상의 데이터에서 컬럼 a,b,c는 음수의 값이 측정될 수 없는 센싱값이다.
따라서, 0 미만의 값을 포함하는 행을 모두 삭제하려고 한다.
이때, d 컬럼은 수치값이 아니므로 제외한다.
ex1_df = pd.DataFrame({ 'a':[-1,0,1,2], 'b':[1,2,3,4], 'c':[9,10,11,-1], 'd':['a','b','c','d'] })
먼저 a,b,c 컬럼의 각 값에 대해서 0 이상인지 판별한다.
# 'a'컬럼부터 'c'컬럼까지 모든 값에 대해서 0 이상인지 판별 ex1_df.loc[:,'a':'c'] >= 0
음수값을 포함한 행은 모두 삭제기 때문에 .all() 함수로 행별 or 연산을 수행한다.
# 행별로 OR연산을 수행한다 # axis=1을 지정하지 않으면 열(컬럼)별로 OR 연산을 수행한다 (ex1_df.loc[:,'a':'c'] >= 0).all(axis=1)
앞서 만든 조건을 이용해서 음수값을 모두 제거 할 수 있다.
condition = (ex1_df.loc[:,'a':'c'] >= 0).all(axis=1) ex1_df.loc[condition, :]
6. 조건 생성에 유용한 함수들
# between(시작숫자,종료숫자) : 시작숫자와 종료숫자 사이의 값이면 True 반환 df.loc[df.tip.between(0.5,2),['tip']]
# .isnull() : Null값을 가지면 True 반환 df.loc[df.payment.isnull(),['payment']]
# .isin([조건리스트]) : 조건리스트 안의 값중 하나와 동일하면 True 반환 df.loc[df.payment.isin(['cash','credit card']),['payment']]
반응형'Data Science > Pandas & Numpy&Scikit-learn' 카테고리의 다른 글
머신러닝 Cross Validation 구현하기, 파이썬 코드 예시(K-fold, sklearn.model_selection.RepeatedKFold) (0) 2022.11.22 Numpy random 함수 (rand, randint, randn, random, power) (0) 2022.10.12 파이썬 수치 데이터 구간화(Binning) 하기 - pd.cut, pd.qcut (0) 2022.09.27 [Pandas] Pandas를 통한 데이터 전처리 (0) 2022.09.13 회귀모델에서 타겟(y)값의 정규화 방법 비교 실험 (0) 2022.05.27