ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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']]

    반응형

    댓글

Designed by Tistory.