본문 바로가기
판다스/판다스에 유용한 넘파이 함수들

[numpy] np.select 함수로 불리언 마스킹

by 김판다t 2024. 10. 26.

np.select 함수를 이용해 조건에 따라 값 부여하기

 

np.select 함수와 불리언 마스킹

 

불리언 마스킹(Boolean Masking)은 조건에 따라 특정 값을 부여하는 작업을 의미합니다. 판다스에서는 불리언 마스킹을 위해 다양한 기법을 제공하며, 일반적으로 mask, np.where 함수가 자주 사용됩니다. 이와 함께 넘파이의 np.select 함수 역시 여러 조건을 기반으로 다양한 값을 부여할 때 매우 유용한 함수로 활용할 수 있습니다.

 

예시

 

이해를 돕기 위해 간단한 예시를 살펴보겠습니다.

import pandas as pd

# 예시 데이터 프레임 생성
data = {'국어': {'가': 86, '나': 79, '다': 93, '라': 80}, 
        '영어': {'가': 90, '나': 10, '다': 50, '라': 95}}
df = pd.DataFrame(data)

df에서 국어와 영어 점수를 기준으로 평가를 부여하는 작업을 진행해 보겠습니다. 국어와 영어 점수가 모두 80점 이상일 경우 수, 한 과목만 80점 이상일 경우 우, 두 과목 모두 80점 미만일 경우 미를 부여할 것입니다.

 

먼저 조건문부터 생성합니다.

# 조건문 생성
cond1 = df['국어'] >= 80
cond2 = df['영어'] >= 80

 

np.where 함수를 통해 세 종류의 값을 반환하려면 두 번 호출해야 합니다. 

# np.where 함수로 수, 우, 미 부여
np.where(cond1 & cond2, '수', np.where(cond1 | cond2, '우', '미'))

 

두 번 정도는 큰 문제가 없지만, 만약 다섯 종류의 값을 반환해야 한다면 np.where 함수를 네 번 중첩해서 사용해야 하므로 코드의 가독성이 떨어지고 비효율적입니다. 이는  np.where 함수뿐만 아니라 mask 함수도 마찬가지입니다.

 

np.select 함수

 

반면 np.select 함수를 사용하면 한 번만 호출하여 이러한 문제를 해결할 수 있습니다. 조건문을 리스트로 묶어 전달하고, 각 조건에 부여할 값도 리스트로 묶어 함께 지정할 수 있습니다. np.select 함수의 문법을 간단하게 표현하면 다음과 같습니다.

np.select([조건1, 조건2,.., 조건n], [값1, 값2,.., 값n], 기본값)

 

예시의 경우 np.select 함수로는 아래와 같은 코드로 구현이 가능합니다.

# np.select 함수로 수, 우, 미 부여
df['학생평가'] = np.select([cond1 & cond2, cond1 | cond2], ['수', '우'], '미')

 

np.select 함수는 이처럼 간결하고 가독성 높은 코드로 수, 우, 미의 세 가지 값을 부여할 수 있습니다. 만약 각 조건의 조합으로 수, 우, 미, 양, 가의 다섯 가지 값을 반환해야 하는 경우라면 np.select가 매우 유용하다는 것을 느끼실 수 있을 것입니다.

 

np.select 함수의 주요 매개변수
np.select(condlist, choicelist, default)
  • condlist: 조건 리스트를 받는 매개변수로 각각의 조건을 condlist에 리스트 형식으로 나열합니다. 이때 조건은 True 또는 False 값을 반환하는 논리 배열이어야 합니다.
  • choicelist: 조건이 True일 때 부여할 값을 리스트로 나열한 매개변수입니다. condlist의 조건 순서에 맞춰 각각의 조건이 만족할 때 부여할 값을 나열해야 합니다.
  • default: 모든 조건을 만족하지 않을 때 적용할 기본값입니다.

np.select 함수 공식 문서 링크


 

유튜브에서 판다스 강의 중입니다.

https://www.youtube.com/@KimPandas