데이터 분석을 하다 보면, 필터링은 매우 중요한 단계입니다. 특히 Pandas 라이브러리를 사용할 때, 데이터프레임의 특정 조건에 맞는 데이터를 선택하는 과정은 자주 발생하는 작업 중 하나입니다. 하지만 이 과정에서 발생하는 몇 가지 흔한 실수와 그에 대한 해결 방법을 정리해보았습니다.

1. 불리언 인덱싱의 혼동

Pandas에서 데이터프레임을 필터링할 때, 불리언 인덱싱이 많이 사용됩니다. 하지만 조건을 설정할 때, 괄호를 잘못 사용하거나 논리 연산자를 잘못 쓰는 경우가 많습니다.

import pandas as pd

data = {
    '이름': ['홍길동', '김철수', '이영희'],
    '나이': [25, 30, 22],
    '성별': ['남', '남', '여']
}
df = pd.DataFrame(data)

# filtered_df = df[df['나이'] > 24 and df['성별']  '남']  # 오류 발생

# 올바른 예: 각 조건을 괄호로 감싸기
filtered_df = df[(df['나이'] > 24) & (df['성별']  '남')]
print(filtered_df)

이처럼 and 대신에 &를 사용하고 각 조건을 괄호로 감싸는 것이 중요합니다. and는 파이썬의 기본 불리언 연산자이지만, Pandas에서는 비트 연산자 &를 사용해야 합니다.

2. 조건의 순서와 데이터 타입

데이터프레임의 각 열이 가지는 데이터 타입이 필터링에 영향을 미칠 수 있습니다. 예를 들어, 문자열 비교를 숫자와 혼합하여 사용하면 예상치 못한 결과를 초래할 수 있습니다.

# 잘못된 예: 문자열과 정수를 혼합
# filtered_df = df[df['나이'] < '30']  # 비어있는 결과

# 올바른 예: 같은 데이터 타입 사용
filtered_df = df[df['나이'] < 30]
print(filtered_df)

항상 데이터 타입을 확인하고, 조건을 설정할 때 일관된 데이터 타입을 사용하는 것이 중요합니다. df.dtypes를 활용해 데이터 타입을 확인할 수 있습니다.

3. NaN 값 처리

데이터프레임에 NaN 값이 포함되어 있을 경우, 필터링 과정에서 의도하지 않은 결과를 초래할 수 있습니다. NaN 값은 비교 연산에서 항상 False로 처리되므로, 이를 적절히 처리해야 합니다.

# 데이터 생성
data_with_nan = {
    '이름': ['홍길동', '김철수', None],
    '나이': [25, None, 22],
    '성별': ['남', '남', '여']
}
df_nan = pd.DataFrame(data_with_nan)

# NaN 값 포함 시 필터링
# filtered_df = df_nan[df_nan['나이'] > 24]  # NaN으로 인해 예상보다 적은 결과

# NaN 값 무시하고 필터링
filtered_df = df_nan[df_nan['나이'].notna() & (df_nan['나이'] > 24)]
print(filtered_df)
notna() 메서드를 사용하면 NaN 값을 제외하고 필터링할 수 있습니다. 데이터 분석 초기에 NaN 값을 어떻게 처리할 것인지 결정하는 것이 중요합니다.

4. 다중 조건 필터링 시 가독성 문제

조건이 복잡해질수록 필터링 코드의 가독성이 떨어질 수 있습니다. 이럴 때는 조건을 변수에 할당하여 가독성을 높일 수 있습니다.

# 조건을 변수로 설정
age_condition = df['나이'] > 24
gender_condition = df['성별'] == '남'

filtered_df = df[age_condition & gender_condition]
print(filtered_df)

이처럼 조건을 변수에 저장해두면 코드가 간결해지고, 나중에 수정하기도 수월해집니다.

5. 데이터프레임 복사에 대한 주의

필터링 후 데이터프레임을 수정할 때, 원본 데이터프레임에 영향을 미치지 않도록 복사본을 만드는 것이 중요합니다. 이를 위해 copy() 메서드를 사용합니다.

filtered_df = df[df['나이'] > 24].copy()  # 필터링 후 복사본 생성
filtered_df['나이'] = filtered_df['나이'] + 1  # 복사본에서만 수정
print(df)        # 원본 데이터프레임은 그대로
print(filtered_df)  # 수정된 복사본

복사본을 사용하면 원본 데이터프레임을 안전하게 유지할 수 있습니다.

마무리

Pandas에서 데이터프레임 필터링은 데이터 분석의 필수적인 부분입니다. 하지만 위에서 언급한 흔한 실수들을 주의하면서 필터링을 진행해야만 정확한 결과를 얻을 수 있습니다. 불리언 인덱싱의 사용, 데이터 타입 일치, NaN 값 처리, 가독성 높은 코드 작성 및 복사본 사용을 통해 더욱 효율적인 데이터 분석을 진행해 보세요. 데이터로 보는 세상에서 여러분의 분석이 더욱 빛날 것입니다!