데이터베이스나 공공데이터 포털에서 데이터를 수집하다 보면 숫자가 아닌 문자열(Text) 형태로 저장된 다양한 데이터 요소를 마주하게 됩니다. 고객의 이메일 주소, 주소지 정보, 공백이 섞인 상품 코드 등이 이에 해당합니다. 이러한 텍스트 데이터는 정제되지 않은 상태로 분석에 활용하기 까다롭기 때문에 전처리 단계를 반드시 거쳐야 합니다.
파이썬(Python) 기본 문법에서도 문자열 처리를 위한 다양한 내장 함수를 제공하지만, 데이터프레임의 열(Column) 전체에 이를 일괄 적용하려면 판다스(Pandas) 고유의 str 접근자(Accessor)를 사용해야 합니다. str 함수를 활용하면 단 한 줄의 코드로 수만 행의 텍스트 데이터를 동시에 가공할 수 있어 실무 효율성을 높일 수 있으며, 빅데이터분석기사(빅분기) 실기 시험에서도 빈번하게 활용됩니다. 이번 글에서는 판다스 문자열 처리의 핵심 기법들을 체계적으로 살펴보겠습니다.
1. 판다스 str 접근자의 작동 원리 이해하기
판다스 데이터프레임이나 시리즈의 열이 문자열 데이터 타입일 때, 컬럼 이름 뒤에 .str을 붙이면 파이썬의 표준 문자열 메서드들을 벡터화(Vectorized)하여 열 전체에 적용할 수 있는 상태가 됩니다.
기본적인 구조는 다음과 같습니다: df['컬럼명'].str.메서드()
이 방식을 사용하면 파이썬의 for 루프문을 돌리지 않고도 모든 행의 문자열을 동시에 처리할 수 있어 대용량 데이터셋을 다룰 때 효율적입니다.
2. 실무 필수 문자열 처리 함수 4가지 및 비즈니스 예시
실무와 시험에서 활용도가 높은 핵심 문자열 가공 함수 4가지를 가상의 이커머스 주문 데이터를 통해 알아보겠습니다.
import pandas as pd
# 가상 주문 데이터 생성
order_df = pd.DataFrame({
'주문번호': [' ORD_01 ', 'ORD_02', 'ORD_03 ', 'ORD_04'],
'고객이메일': ['Kim@Naver.com', 'lee@gmail.com', 'PARK@daum.net', 'choi@Gmail.com'],
'상품코드': ['PROD-A-01', 'PROD-B-02', 'PROD-A-03', 'PROD-C-01']
})
2.1. 양끝 공백 제거하기 (strip)
외부 데이터를 로드하면 문자열 앞뒤에 눈에 보이지 않는 공백(Space)이 포함되어 데이터 병합(merge)이나 필터링이 정상적으로 작동하지 않는 경우가 있습니다. 이때 strip()을 활용하여 공백을 정리합니다.
# '주문번호' 컬럼의 양끝 공백을 제거하여 갱신
order_df['주문번호'] = order_df['주문번호'].str.strip()
2.2. 대소문자 변환하기 (lower, upper)
이메일 주소나 영문 코드는 대소문자가 혼재되어 있으면 서로 다른 데이터로 인식됩니다. lower()는 전체를 소문자로, upper()는 전체를 대문자로 변환하여 텍스트 데이터의 기준을 통일해 줍니다.
# '고객이메일'을 모두 소문자로 통합하여 도메인 분석 기반 마련
order_df['고객이메일'] = order_df['고객이메일'].str.lower()
2.3. 문자열 치환 및 삭제 (replace)
특정 문자나 패턴을 다른 문자로 바꾸거나 아예 제거하고 싶을 때 replace()를 사용합니다.
# '상품코드'에서 하이픈(-)을 언더바(_)로 치환
order_df['상품코드_변경'] = order_df['상품코드'].str.replace('-', '_')
2.4. 특정 문자열 포함 여부 판별 (contains)
특정 단어나 패턴이 문자열 내에 포함되어 있는지 검사하여 참(True) 또는 거짓(False)의 불리언 시리즈를 반환합니다. 7화에서 배운 불리언 인덱싱과 결합하여 특정 조건의 데이터를 필터링할 때 유용합니다.
# 상품코드에 'PROD-A'가 포함된 행만 필터링하여 추출
prod_a_orders = order_df[order_df['상품코드'].str.contains('PROD-A')]
3. 문자열 분할(split)과 파생변수 확장 기법
텍스트 데이터 중에는 하나의 열에 여러 정보가 기호로 구분되어 뭉쳐 있는 경우가 많습니다. ‘PROD-A-01’처럼 대분류-중분류-소분류 형태로 결합된 데이터가 대표적입니다. 이 경우 split() 함수를 사용하면 특정 구분자(delimiter)를 기준으로 문자열을 분리할 수 있습니다.
# 하이픈(-)을 기준으로 문자열 분할
split_columns = order_df['상품코드'].str.split('-')
print(split_columns)
[출력 결과]
0 [PROD, A, 01]
1 [PROD, B, 02]
2 [PROD, A, 03]
3 [PROD, C, 01]
Name: 상품코드, dtype: object
기본적으로 split()은 쪼개진 문자열들을 파이썬 리스트 형태로 반환합니다. 만약 이 리스트의 원소들을 각각 독립된 데이터프레임의 열로 확장하여 분리하고 싶다면 expand=True 파라미터를 추가해야 합니다.
# 분할된 문자열을 개별 열로 확장하여 파생변수로 추가
order_df[['상품유형', '카테고리', '상세번호']] = order_df['상품코드'].str.split('-', expand=True)
이 연산을 실행하면 기존 데이터프레임 우측에 ‘상품유형’, ‘카테고리’, ‘상세번호’라는 3개의 새로운 컬럼이 깔끔하게 생성되며, 그룹별 집계 연산을 수행하기 좋은 형태로 데이터 구조가 정돈됩니다.
4. 빅데이터분석기사 실기 시험 환경에서의 실전 활용 포인트
빅데이터분석기사 실기(특히 작업형 제1유형)에서는 문자열 처리 함수를 단독으로 사용하기보다, 특정 문자열 조건을 만족하는 관측치들을 걸러낸 뒤 통계량을 계산하는 문제가 주로 출제됩니다.
4.1. contains 기반 조건부 통계량 추출
예를 들어 “고객 주소 정보가 담긴 데이터셋에서 거주지가 ‘서울’을 포함하는 고객들의 평균 나이를 구하시오”라는 문제가 있다면 아래와 같이 간결한 파이프라인으로 해결할 수 있습니다.
# 1. 주소 컬럼에 '서울'이 포함된 행만 필터링 (결측치 처리 전략 병행)
# na=False 옵션은 결측치(NaN)가 존재할 경우 에러 대신 False를 반환하도록 안전장치 역할을 합니다.
seoul_customers = df[df['주소'].str.contains('서울', na=False)]
# 2. 필터링된 서브셋의 나이 컬럼 평균 계산
result = seoul_customers['나이'].mean()
print(result)
4.2. 금액 데이터의 문자열 기호 제거 후 수치형 변환
공공데이터나 금융 관련 데이터셋 중에는 금액 데이터가 15,000원 또는 $1,200과 같이 특수문자가 섞인 채 object(문자열) 타입으로 제공되는 경우가 많습니다. 이 상태로는 수학적 연산이 불가능하므로 반드시 str.replace로 기호를 제거한 뒤 데이터 타입을 정수나 실수형으로 변환해 주어야 머신러닝 모델의 피처로 사용할 수 있습니다.
# 쉼표(,)와 '원' 글자를 제거한 뒤 정수형(int)으로 변환하는 실전 프로토콜
df['가격'] = df['가격'].str.replace(',', '').str.replace('원', '').astype(int)
이처럼 문자열 전처리 기술은 사람이 읽기 쉬운 원본 텍스트 데이터를 분석 가능한 정형 데이터 형태로 변환하여 데이터 품질과 모델 신뢰성을 높이는 기초가 됩니다.
5. 요약 및 다음 화 안내
str 접근자: 데이터프레임 열 전체의 문자열 데이터를 반복문 없이 일괄 처리할 수 있도록 지원하는 판다스 기능입니다.strip(),lower(),replace(),contains(): 문자열 공백 제거, 대소문자 단일화, 패턴 치환, 특정 단어 포함 확인 등 클렌징 작업에 활용됩니다.split(expand=True): 구분자를 기준으로 하나의 문자열 열을 여러 개의 독립된 파생변수 열로 분할 확장해 줍니다.
다음 [판다스 14화]에서는 날짜와 요일, 시간의 변화에 따른 데이터의 트렌드를 추적하기 위해 필수적인 날짜와 시간 데이터(datetime) 처리 완전 정복에 대해 상세하게 학습해 보겠습니다. 시계열 데이터 분석의 기초 체력을 함께 다져봅시다.