NumPy의 where() 메서드를 활용하면 Pandas DataFrame을 간편하게 필터링할 수 있습니다. 이 메서드는 지정한 조건을 만족하는 요소의 인덱스 위치를 반환하기 때문에, 그 결과를 DataFrame의 loc[]과 함께 사용하면 조건에 맞는 행만 깔끔하게 추출할 수 있습니다.
필요한 라이브러리 임포트
먼저 필요한 라이브러리를 각각의 관례적인 별칭(alias)과 함께 임포트합니다.
import pandas as pd import numpy as np
예제용 DataFrame 생성
제품 재고 정보를 담은 Pandas DataFrame을 생성해 보겠습니다. 'Product'(제품명), 'Opening_Stock'(기초 재고), 'Closing_Stock'(기말 재고) 세 개의 열로 구성된 데이터입니다.
dataFrame = pd.DataFrame({
"Product": ["SmartTV", "ChromeCast", "Speaker", "Earphone"],
"Opening_Stock": [300, 700, 1200, 1500],
"Closing_Stock": [200, 500, 1000, 900]
})
조건 2개로 DataFrame 필터링하기
NumPy의 where() 메서드 안에 두 가지 조건을 논리 AND 연산자(&)로 연결해 지정합니다. 아래 예제에서는 'Opening_Stock'이 700 이상이면서 동시에 'Closing_Stock'이 1000 미만인 행만 필터링합니다.
resValues1 = np.where((dataFrame['Opening_Stock'] >= 700) &
(dataFrame['Closing_Stock'] < 1000))
print("\nFiltered DataFrame Value = \n", dataFrame.loc[resValues1])
참고: 실무에서는 np.where()보다 DataFrame의 불리언 인덱싱(dataFrame[(조건1) & (조건2)])을 사용하는 편이 더 직관적이고 간결해서 일반적으로 권장됩니다.
조건 3개로 DataFrame 필터링하기
세 개 이상의 조건도 같은 방식으로 결합할 수 있습니다. 아래 예제에서는 'Opening_Stock'이 500 이상, 'Closing_Stock'이 1000 미만, 그리고 제품명이 'C'로 시작한다는 세 조건을 모두 만족하는 행만 추출합니다.
resValues2 = np.where((dataFrame['Opening_Stock'] >= 500) &
(dataFrame['Closing_Stock'] < 1000) &
(dataFrame['Product'].str.startswith('C')))
전체 예제 코드
지금까지 살펴본 내용을 하나로 합친 완전한 코드입니다.
import pandas as pd
import numpy as np
# 예제 DataFrame 생성
dataFrame = pd.DataFrame({
"Product": ["SmartTV", "ChromeCast", "Speaker", "Earphone"],
"Opening_Stock": [300, 700, 1200, 1500],
"Closing_Stock": [200, 500, 1000, 900]
})
print("DataFrame...\n", dataFrame)
# 조건 2개로 필터링
resValues1 = np.where((dataFrame['Opening_Stock'] >= 700) &
(dataFrame['Closing_Stock'] < 1000))
print("\nFiltered DataFrame Value = \n", dataFrame.loc[resValues1])
# 조건 3개로 필터링
resValues2 = np.where((dataFrame['Opening_Stock'] >= 500) &
(dataFrame['Closing_Stock'] < 1000) &
(dataFrame['Product'].str.startswith('C')))
print("\nFiltered DataFrame Value = \n", dataFrame.loc[resValues2])
실행 결과
위 코드를 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
DataFrame... Closing_Stock Opening_Stock Product 0 200 300 SmartTV 1 500 700 ChromeCast 2 1000 1200 Speaker 3 900 1500 Earphone Filtered DataFrame Value = Closing_Stock Opening_Stock Product 1 500 700 ChromeCast 3 900 1500 Earphone Filtered DataFrame Value = Closing_Stock Opening_Stock Product 1 500 700 ChromeCast
마무리
NumPy의 where() 메서드는 조건식을 만족하는 요소의 인덱스를 반환하므로, 이를 DataFrame.loc[]과 조합하면 복수 조건 기반의 행 필터링을 손쉽게 구현할 수 있습니다. 조건이 많아질 때는 각 조건을 괄호로 묶어 &(AND), |(OR) 연산자로 연결하면 되며, 최신 환경에서는 불리언 마스크를 직접 사용하는 방식이 더 안전하고 가독성이 좋으니 상황에 맞게 선택하시길 바랍니다.