문제 개요
데이터 전처리 작업을 하다 보면 문자열에 포함된 공백 개수를 기준으로 특정 요소를 걸러내야 하는 경우가 있습니다. 이 글에서는 판다스(Pandas) 시리즈(Series)에서 정확히 두 개의 공백을 포함하는 문자열 요소를 제거하는 세 가지 방법을 예제 코드와 함께 살펴보겠습니다.
입력 — 다음과 같은 시리즈가 있다고 가정해 보겠습니다.
0 This is pandas 1 python script 2 pandas series
출력 — 정확히 두 개의 공백을 포함하는 요소가 제거된 최종 결과는 다음과 같습니다.
1 python script 2 pandas series
위 예시에서 "This is pandas"는 단어 사이 공백이 정확히 두 개이므로 제거 대상이 되고, 나머지 두 요소는 그대로 유지됩니다.
해결 방법 1: lambda filter와 정규 표현식 활용
먼저 Series를 정의합니다.
lambda filter 메서드에 정규 표현식을 적용하여, 공백의 개수가 2개가 아닌 요소만 추출합니다.
pd.Series(filter(lambda x:len(re.findall(r" ",x))!=2,data))
여기서 re.findall(r" ", x)는 문자열 x에서 모든 공백을 찾아 리스트로 반환하며, 그 길이가 곧 공백의 개수가 됩니다. 이 값이 2가 아니면 필터를 통과하게 됩니다.
마지막으로
isin()함수를 사용해 원본 시리즈에서 필터링된 결과에 해당하는 값들만 선택합니다.
해결 방법 2: for 반복문과 count() 활용
Series를 정의합니다.
for 반복문으로 요소를 하나씩 순회하면서, if 조건문으로 해당 문자열의 공백 개수가 2인지 확인합니다. 조건에 맞는 요소는
pop()메서드로 제거합니다.
for i,j in data.items():
if(j.count(' ')==2):
data.pop(i)j.count(' ')는 문자열 내 공백 문자의 개수를 직접 세어주므로, 정규 표현식 없이도 간단하게 조건을 검사할 수 있다는 장점이 있습니다.
예제 코드
아래 구현 예제를 통해 더 자세히 이해해 보겠습니다.
import pandas as pd import re l = ["This is pandas","python script","pandas series"] data = pd.Series(l) result = pd.Series(filter(lambda x:len(re.findall(r" ",x))!=2,data)) print(data[data.isin(result)])
실행 결과
1 python script 2 pandas series dtype: object
해결 방법 3: 반복문 방식의 전체 구현
두 번째 방법을 실제로 적용한 전체 코드는 다음과 같습니다.
import pandas as pd
l = ["This is pandas","python script","pandas Series"]
data = pd.Series(l)
for i,j in data.items():
if(j.count(' ')==2):
data.pop(i)
print(data)실행 결과
1 python script 2 pandas series dtype: object
마무리
정리하면, 첫 번째 방법은 filter()와 정규 표현식을 조합해 함수형 스타일로 처리하고, 두 번째와 세 번째 방법은 items()로 인덱스와 값을 순회하며 count()로 조건을 검사한 뒤 pop()으로 제거합니다. 데이터 크기가 크다면 불변 방식인 첫 번째 방법이, 코드 가독성을 중시한다면 반복문 방식이 유용할 수 있습니다. 상황에 맞는 방법을 선택해 활용해 보시기 바랍니다.