데이터 분석 작업을 하다 보면 문자열과 숫자가 뒤섞인 시리즈(Series)에서 정수 값만 골라내야 하는 경우가 자주 발생합니다. 이 글에서는 파이썬의 Pandas 라이브러리를 활용해 혼합형 시리즈에서 정수 요소만 효과적으로 필터링하는 두 가지 방법을 소개합니다.
문제 상황
다음과 같이 정수와 문자열이 섞여 있는 시리즈가 있다고 가정해 보겠습니다.
입력(Input)
0 1 1 2 2 python 3 pandas 4 3 5 4 6 5
출력(Output) — 정수 요소만 필터링한 결과는 다음과 같습니다.
0 1 1 2 4 3 5 4 6 5
해결 방법 1: 타입 검사를 활용한 반복 처리
가장 직관적인 방법은 각 요소의 데이터 타입을 검사하는 것입니다. 시리즈를 순회하면서 해당 요소가 int 타입인지 확인하고, 정수인 경우에만 인덱스와 값을 출력합니다.
예제 코드
import pandas as pd ls = [1,2,"python","pandas",3,4,5] data = pd.Series(ls) for i,j in data.items(): if(type(j)==int): print(i,j)
실행 결과
0 1 1 2 4 3 5 4 6 5
data.items() 메서드는 인덱스와 값을 함께 반환하므로, 조건문으로 int 타입 여부만 판별하면 손쉽게 원하는 결과를 얻을 수 있습니다.
해결 방법 2: lambda filter와 정규표현식 활용
조금 더 함수형 프로그래밍 스타일로 접근하고 싶다면 filter() 함수와 lambda, 그리고 정규표현식(re 모듈)을 조합할 수 있습니다. 이 방법은 다음 단계로 진행됩니다.
먼저 리스트로부터
pd.Series객체를 생성합니다.filter()안에lambda함수를 적용하고, 정규표현식r"\d+"로 숫자 여부를 검사합니다. 정규표현식은 문자열에만 동작하므로 모든 요소를str()로 변환해야 합니다.마지막으로
isin()함수를 사용해 원본 시리즈에서 필터링된 값과 일치하는 요소만 추출합니다.
예제 코드
import pandas as pd import re ls = [1,2,"python","pandas",3,4,5] data = pd.Series(ls) result = pd.Series(filter(lambda x:re.match(r"\d+",str(x)),data)) print(data[data.isin(result)])
실행 결과
0 1 1 2 4 3 5 4 6 5
마무리
두 방법 모두 동일한 결과를 제공하지만, 상황에 따라 선택 기준이 달라질 수 있습니다. 코드의 가독성과 단순함이 중요하다면 타입 검사 방식이 적합하고, 정규표현식 기반의 유연한 패턴 매칭이 필요하거나 함수형 스타일을 선호한다면 lambda filter 방식이 유용합니다. 데이터 전처리 과정에서 혼합형 시리즈를 다룰 때 이 두 가지 기법을 적절히 활용해 보시기 바랍니다.