0Pricing
Pandas & NumPy Academy · 강의

DataFrames의 불리언 인덱싱

열에 불리언 조건을 적용해 행을 필터링하고 & 및 | 연산자로 여러 조건을 결합합니다.

DataFrames의 불리언 인덱싱은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

불리언 인덱싱이란 무엇인가요?

불리언 인덱싱을 사용하면 True와 False 값으로 이루어진 Series를 생성하는 조건을 적용해 DataFrame의 행을 필터링할 수 있습니다. 조건이 True인 행만 반환됩니다. 이는 읽기 쉽고 빠르기 때문에 Pandas에서 가장 자주 사용하는 선택 기법 중 하나입니다.

예를 들어 매출 DataFrame이 있다면 반복문을 작성하지 않고도 매출이 1000을 초과하는 모든 행을 즉시 가져올 수 있습니다.

import pandas as pd

df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D'],
    'revenue': [500, 1500, 800, 2000]
})

# Boolean condition produces a Series of True/False
mask = df['revenue'] > 1000
print(mask)
# 0    False
# 1     True
# 2    False
# 3     True

불리언 마스크 적용

불리언 마스크가 있으면 DataFrame의 대괄호 안에 전달해 조건에 맞는 행만 선택할 수 있습니다. 결과는 새 DataFrame이며 원본은 수정되지 않습니다. 원본의 행 인덱스가 유지되므로 각 행의 출처를 항상 알 수 있습니다.

마스크를 만든 다음 적용하는 이 방식은 행 필터링에 사용하는 표준 Pandas 관용구입니다.

import pandas as pd

df = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D'],
    'revenue': [500, 1500, 800, 2000]
})

mask = df['revenue'] > 1000
filtered = df[mask]
print(filtered)
#   product  revenue
# 1       B     1500
# 3       D     2000

마스크 변수 없이 조건을 인라인으로 작성하기

불리언 Series를 변수에 할당할 필요는 없습니다. 대괄호 안에 조건을 인라인으로 직접 작성할 수 있습니다: df[df['col'] > value]. 이 한 줄 작성 방식은 코드를 간결하고 읽기 쉽게 유지해 주므로 데이터 분석 노트북에서 매우 흔히 사용됩니다.

두 방식, 즉 마스크 변수를 사용하는 방식과 인라인 방식은 동일한 결과를 냅니다. 조건이 복잡하거나 재사용될 때는 변수를 사용하고, 간단한 일회성 필터에는 인라인 방식을 사용하십시오.

import pandas as pd

df = pd.DataFrame({
    'city': ['NYC', 'LA', 'Chicago', 'Houston'],
    'population': [8_336_817, 3_979_576, 2_693_976, 2_320_268]
})

# Inline boolean filter
large_cities = df[df['population'] > 3_000_000]
print(large_cities)
#   city  population
# 0  NYC   8336817
# 1   LA   3979576

& (AND)로 조건 결합하기

두 조건이 모두 참이어야 한다면 & 연산자로 결합하십시오. 배열에 요소별로 적용되지 않는 Python의 and 키워드는 사용하지 마십시오. &는 비교 연산자보다 우선순위가 높으므로 각 조건을 괄호로 감싸야 합니다.

결과에는 모든 하위 조건이 True로 평가되는 행만 남습니다.

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Carol', 'Dave'],
    'age': [25, 35, 28, 45],
    'salary': [50000, 90000, 70000, 120000]
})

# Both conditions must be true
result = df[(df['age'] > 27) & (df['salary'] > 60000)]
print(result)
#     name  age  salary
# 1    Bob   35   90000
# 2  Carol   28   70000

| (OR)로 조건 결합하기

| 연산자를 사용하면 하나 이상의 조건이 참인 행을 남길 수 있습니다. &와 마찬가지로 각 하위 조건을 괄호로 감싸야 합니다. | 연산자는 불리언 배열 전체에 요소별 논리 OR를 수행합니다.

&와 |를 함께 사용하는 것도 문제없습니다. 다만 올바른 평가 순서를 적용하고 미묘한 논리 오류를 피하려면 괄호를 주의해서 사용하십시오.

import pandas as pd

df = pd.DataFrame({
    'product': ['Laptop', 'Mouse', 'Monitor', 'Keyboard'],
    'price': [1200, 25, 300, 80],
    'category': ['Electronics', 'Accessories', 'Electronics', 'Accessories']
})

# Rows where price > 200 OR category is Accessories
result = df[(df['price'] > 200) | (df['category'] == 'Accessories')]
print(result)
#     product  price     category
# 0    Laptop   1200  Electronics
# 1     Mouse     25  Accessories
# 2   Monitor    300  Electronics
# 3  Keyboard     80  Accessories

~로 조건 부정하기

~ 물결표 연산자는 불리언 Series를 반전하여 True를 False로, False를 True로 바꿉니다. ~를 사용해 'NOT' 논리를 표현할 수 있습니다. 즉, 조건과 일치하지 않는 행을 남깁니다. 반대 조건을 직접 구성하는 것보다 깔끔한 방식입니다.

예를 들어 df[~df['status'].isin(['cancelled', 'refunded'])]는 두 상태를 제외한 모든 행을 남깁니다.

import pandas as pd

df = pd.DataFrame({
    'order_id': [1, 2, 3, 4],
    'status': ['shipped', 'cancelled', 'delivered', 'refunded']
})

# Keep only rows that are NOT cancelled
active = df[~(df['status'] == 'cancelled')]
print(active)
#    order_id     status
# 0         1    shipped
# 2         3  delivered
# 3         4   refunded

문자열 값으로 필터링하기

불리언 인덱싱은 텍스트 열에도 똑같이 적용됩니다. ==로 정확히 일치하는 값을 필터링하거나, 조건 안에서 .str 메서드인 .str.startswith(), .str.contains(), .str.upper() 등을 사용해 유연하게 텍스트를 필터링할 수 있습니다.

Pandas의 문자열 비교는 기본적으로 대소문자를 구분하므로 'NYC'와 'nyc'는 서로 다른 값으로 처리됩니다. 필요하다면 먼저 대소문자를 통일하십시오.

import pandas as pd

df = pd.DataFrame({
    'country': ['USA', 'Germany', 'UK', 'USA', 'France'],
    'sales': [400, 200, 150, 600, 300]
})

# Filter rows where country equals USA
us_sales = df[df['country'] == 'USA']
print(us_sales)
#   country  sales
# 0     USA    400
# 3     USA    600

# Filter rows where country starts with 'G'
g_countries = df[df['country'].str.startswith('G')]
print(g_countries)
#    country  sales
# 1  Germany    200

여러 열로 필터링하기

복잡한 분석에서는 여러 열의 조건을 &와 |로 결합해야 하는 경우가 많습니다. 매우 긴 조건은 읽기 쉽도록 이름이 있는 불리언 Series로 나누십시오. 각 Series는 마지막에 결합하는 이름 있는 하위 필터로 작동합니다.

이 방식은 의도를 명확하게 만들어 줍니다. 각 줄이 필터 논리의 한 부분을 설명하는 한국어 문장처럼 읽히기 때문입니다.

import pandas as pd

df = pd.DataFrame({
    'region': ['North', 'South', 'North', 'East'],
    'year': [2022, 2023, 2023, 2022],
    'profit': [5000, -200, 8000, 3000]
})

is_north = df['region'] == 'North'
is_2023 = df['year'] == 2023
is_profitable = df['profit'] > 0

result = df[is_north & is_2023 & is_profitable]
print(result)
#   region  year  profit
# 2  North  2023    8000

np.where로 조건부 열 만들기

불리언 인덱싱은 행을 필터링하지만, 행을 삭제하는 대신 조건에 따라 새 열을 추가하고 싶을 때도 있습니다. np.where(condition, value_if_true, value_if_false)는 열 전체의 각 요소에 if/else를 적용하는 벡터화된 방식이며, lambda와 함께 apply를 사용하는 것보다 훨씬 빠릅니다.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'score': [45, 72, 88, 61, 95]
})

# Create a new column based on a condition
df['grade'] = np.where(df['score'] >= 70, 'Pass', 'Fail')
print(df)
#    score grade
# 0     45  Fail
# 1     72  Pass
# 2     88  Pass
# 3     61  Fail
# 4     95  Pass

필터링된 부분집합에 값 할당하기

.loc[mask, column]을 사용하면 필터링된 행의 값을 제자리에서 업데이트할 수 있습니다. 이는 부분집합에 값을 설정하는 안전한 방법입니다. df[mask]['col'] = value와 같은 연쇄 인덱싱은 복사본에 대해 작업하므로 SettingWithCopyWarning을 발생시킬 수 있습니다.

원본 DataFrame을 제자리에서 수정하려면 항상 df.loc[mask, 'col'] = value를 우선 사용하십시오.

import pandas as pd

df = pd.DataFrame({
    'item': ['A', 'B', 'C', 'D'],
    'stock': [0, 5, 0, 12]
})

# Mark out-of-stock items
df.loc[df['stock'] == 0, 'status'] = 'Out of Stock'
df.loc[df['stock'] > 0, 'status'] = 'Available'
print(df)
#   item  stock        status
# 0    A      0  Out of Stock
# 1    B      5     Available
# 2    C      0  Out of Stock
# 3    D     12     Available

마스크 세고 합산하기

불리언 값은 내부적으로 1(True)과 0(False)이므로 마스크에 .sum()을 호출해 일치하는 행의 수를 세거나, .mean()을 사용해 일치하는 행의 비율을 구할 수 있습니다. 이러한 빠른 집계는 행을 선택하기 위해 필터를 적용하기 전에 필터 논리를 검증하는 데 도움이 됩니다.

import pandas as pd

df = pd.DataFrame({'value': [10, 55, 30, 80, 20, 70]})

mask = df['value'] > 40
print('Count of rows > 40:', mask.sum())      # 3
print('Fraction > 40:', mask.mean().round(2)) # 0.5

# Now apply
print(df[mask])
#    value
# 1     55
# 3     80
# 5     70

빠른 확인

DataFrame에서 불리언 인덱싱을 사용하는 방법을 제대로 이해했는지 확인해 보십시오.

강의 복습

이 강의에서는 다음을 배웠습니다. 불리언 마스크는 열에 조건을 적용해 행을 필터링합니다. & 및 | 연산자는 여러 조건을 결합합니다(Python의 and/or가 아님). 또한 ~는 불리언 마스크를 반전하여 NOT 논리를 구현합니다. 필터링된 행에 안전하게 값을 할당하려면 df.loc[mask, col] = value를 사용하십시오. 다음으로는 읽기 쉬운 문자열로 필터를 작성하는 query() 메서드를 살펴봅니다.

자주 묻는 질문

“DataFrames의 불리언 인덱싱” 강의는 무료인가요?

네 — “DataFrames의 불리언 인덱싱” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“DataFrames의 불리언 인덱싱”에서 뭘 배우나요?

열에 불리언 조건을 적용해 행을 필터링하고 & 및 | 연산자로 여러 조건을 결합합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“DataFrames의 불리언 인덱싱” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. DataFrames의 불리언 인덱싱
  2. query() 메서드
  3. isin() 및 between() 필터
  4. 패턴으로 열 선택하기
← Pandas & NumPy Academy(으)로 돌아가기