ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] 판다스 마스킹과 쿼리 함수 이용하기
    Python/Pandas, Numpy 2023. 4. 25. 10:34
    반응형

    판다스 마스킹과 쿼리 함수 이용하기


    판다스의 마스킹


    파이썬(Python)에서 판다스(Pandas) 를 이용할 때, 특정 조건에 맞는 데이터만 골라서 추출하고 싶을 때가 있습니다. 그럴 때는 일반적으로 마스킹(masking)이라는 기법을 이용합니다. 예를 들어, 아래의 df 데이터프레임에서 pandas 라는 row만 추출하고 싶다면 이렇게 합니다.

     

     

    import pandas as pd
    
    data = {'A': [1,2,3,3,3], 'B': ['hello','world','python','pandas','query']}
    df = pd.DataFrame(data)
    df
      A B
    0 1 hello
    1 2 world
    2 3 python
    3 3 pandas
    4 3 query

     

     

    m = df['B'] == 'pandas'
    df[m]
      A B
    3 3 pandas

     

     

    이걸 마스킹이라고 부르는 이유를 아시겠나요? 마스킹은 미술 등에서 불필요한 부분을 가리는 것을 뜻하는데, 데이터프레임에서도 지정된 조건에 맞지 않는 부분을 가리는 것이 이와 꼭 닮았다는 생각에 사람들이 마스킹이라고 부르게 되었습니다. 위와 같은 방법은 사실 인덱싱(indexing)의 고급 활용인데, 자주 쓰는 바람에 마스킹이라는 이름이 굳어진 케이스입니다.

     

     

    참고로, 판다스에서는 이름부터 마스크(mask) 라고 하는 함수가 존재합니다. 마스크 함수는 앞서 알려드린 정의를 문자 그대로 실행하는 함수인데요, 주어진 조건에 해당하는 내용을 NaN 으로, 해당하지 않는 내용은 원본 값 그대로 리턴하는 함수입니다. 두 가지 마스킹 기법 중 편한것을 선택하시면 되겠습니다.

     

     

    # 마스크 함수를 이용한 마스킹
    df.mask(df['A'] > 2)
      A B
    0 1.0 hello
    1 2.0 world
    2 NaN NaN
    3 NaN NaN
    4 NaN NaN

     

     

    판다스 쿼리 함수


    그런데, 위와 같은 마스킹 기법은 단순한 수식이나 조건에서는 효율적이지만, 복잡한 조건을 사용해야 하거나 외부 함수를 참조하는 상황의 경우, 또는 여러가지 조건을 적용해야 하는 상황 등에서는 불편함이 있습니다. 가독성을 크게 떨어뜨리는 식을 적거나, 마스킹을 여러 차례 해야 하기 때문이지요.

     

     

    이럴때는, 판다스에서 제공하는 쿼리(Query) 함수를 사용해 간단하게 해결할 수 있습니다. 쿼리 함수는 대소 비교나 부분검색, 외부 함수 참조 등의 다양한 기능을 지원합니다.

     

     

    쿼리 함수는 pandas.DataFrame.query(expr) 와 같은 형식으로 이용할 수 있습니다. 이 함수의 특이한 점으로는, 조건문(expr) 에 해당하는 항목을 문자열로 작성한다는 부분이 있겠네요. 쿼리 함수를 이용하는 법을 간단한 마스킹을 통해 알아보도록 합시다. 앞서 살펴본 A column의 값이 3인 데이터만 보고 싶을 때, 쿼리 함수를 어떻게 사용하는지 알아보죠.

     

     

    query_expr = 'A == 3'
    df.query(query_expr)
      A B
    2 3 python
    3 3 pandas
    4 3 query

     

     

    이렇게 조건문을 설정하면 A가 3인 항목들만 출력됩니다. 조건문이 query_expr라는 변수에 문자열로 저장되어 있기 때문에, 특정 상황에서 조건이 변동되는 프로그램을 만들 때 쿼리 함수가 유용하게 사용될 수 있습니다.

     

     

    파이썬에서는 하나의 조건만 사용하지는 않습니다. 그래서, 실제로 판다스 쿼리 함수를 사용할 때는 상기한 조건 이외에도, 다양한 조건을 이용하게 되겠지요. 우선, 단순한 조건부터 살펴볼까요?

     

    • A == b : A와 b가 일치하는 항목
    • A != b : A와 b가 일치하지 않는 항목
    • A > b : A가 b보다 큰 항목
    • A < b : A가 b보다 작은 항목
    • A >= b : A가 b 이상인 항목
    • A <= b : A가 b 이하인 항목

     

    이렇게 기초 연산자부터 활용할 수 있습니다. 그리고, 조건이 길어지거나 다양한 조건을 적용해야 할 때는 사용자 지정 함수를 만들어서 이용할 수도 있습니다. 문자열 안에 조건을 입력하는 쿼리 함수의 특성상, 이 안에서 함수를 이용할 때는 @ 를 이용해 표기해야 합니다. 아래와 같이 말이죠.

     

     

    def plus(a, b):
        return a + b
    
    query_expr = 'A == @plus(1, 1)'
    df.query(query_expr)
      A B
    1 2 world

     

     

    위와 같은 코드를 입력할 경우, 사용자 정의 함수인 plus 의 결과에 따라, A가 결과값에 해당하는 데이터만 볼 수 있게 됩니다.

     

     

    판다스 쿼리 함수는 이외에도 변수를 입력할수 있습니다. 변수를 입력하는 방법은 함수와 같은데요, 이번에는 @ 표기 말고 f-string 이라는 방법을 이용해 표기해 보도로 하겠습니다.

     

     

    msg = 'hello'
    
    query_expr = f'B == "{msg}"'
    df.query(query_expr)
      A B
    0 1 hello

     

     

    쿼리 함수에 사용되는 조건은 문자열로 이루어져 있다는 사실을 주의해 주세요. 이 안에서 문자열을 사용할 경우, 별도의 따옴표를 입력해 줘야 합니다. 물론, query_expr 을 표기하는 따옴표와는 다른 따옴표를 사용해야 합니다. 예를 들어, query_expr이 작은따옴표를 사용했다면 msg 를 표기할 때는 큰따옴표를 쓰는 식으로 말이죠.

     

     

    위와 같이, 파이썬을 사용하면서 마스킹 작업을 하려면, 판다스에서 인덱싱을 활용하거나 쿼리 함수를 이용하면 됩니다. 마스킹은 판다스를 사용하는 실력을 크게 향상시켜주니 꼭 제대로 마스터하시는걸 추천드립니다.

    반응형

    댓글

문의: jwkang3929@naver.com