문제 개요
Pandas 시리즈(Series)에 저장된 각 단어를 검사하여, 특수 문자가 2개 이상 포함된 단어의 총 개수를 구하는 방법을 알아보겠습니다.
입력 예시
다음과 같은 시리즈가 있다고 가정합니다.
0 fruits!!
1 *cakes*
2 $nuts
3 #drinks
dtype: object
이 시리즈에서 특수 문자가 2개 이상 들어 있는 단어는 'fruits!!'와 '*cakes*' 두 개이므로, 기대되는 결과값은 2입니다.
이 문제를 해결할 수 있는 여러 가지 방법을 하나씩 살펴보겠습니다.
해결 방법 1: 반복문과 조건문 활용
가장 기본적인 접근 방식으로, 다음 순서로 진행합니다.
- Pandas 시리즈를 정의합니다.
- 특수 문자 목록을 생성합니다. 파이썬의
string.punctuation을 활용하면 편리합니다. - 각 단어별 특수 문자 개수와 총 개수를 저장할 변수를 0으로 초기화합니다.
- for 반복문으로 시리즈의 값을 하나씩 확인하면서, 각 문자가 특수 문자 목록에 포함되어 있는지 검사합니다.
for i in data:
chars_count = 0
for j in list(i):
if j in special_char:
chars_count = chars_count + 1
이후 특수 문자 개수가 1보다 크면(즉, 2개 이상이면) 총 개수를 1 증가시킵니다.
if(chars_count > 1):
total_count = total_count + 1
print(total_count)
전체 구현 예제
import pandas as pd
import string
l = ["Fruits!!", "*Cakes*", "$Nuts", "#Drinks"]
data = pd.Series(l)
chars = string.punctuation
special_char = list(chars)
total_count = 0
for i in data:
chars_count = 0
for j in list(i):
if j in special_char:
chars_count = chars_count + 1
if(chars_count > 1):
total_count = total_count + 1
print(total_count)
해결 방법 2: 정규표현식과 람다 함수 활용
더 간결한 방법으로는 정규표현식(regular expression)과 filter(), lambda 함수를 조합할 수 있습니다.
- 단어 리스트를 정의합니다.
re.findall(r"\W", x)로 각 단어에서 특수 문자를 모두 찾습니다. 정규식 패턴\W는 알파벳, 숫자, 언더스코어(_)를 제외한 모든 문자, 즉 특수 문자와 매칭됩니다.- 찾은 특수 문자의 길이가 1보다 큰 경우만 필터링합니다.
import pandas as pd
import re
l = ["fruits!!", "*cakes*", "$nuts", "#drinks"]
data = pd.Series(filter(lambda x: 1 < len(re.findall(r"\W", x)), l))
전체 구현 예제
import pandas as pd
import re
l = ["fruits!!", "*cakes*", "$nuts", "#drinks"]
data = pd.Series(filter(lambda x: 1 < len(re.findall(r"\W", x)), l))
print("count:", len(data))
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
2
정리
반복문 기반 방법은 로직을 단계별로 이해하기 좋고, 정규표현식 방법은 코드가 훨씬 간결하고 파이썬답다는 장점이 있습니다. 실무에서는 데이터 규모가 클수록 정규표현식과 벡터화 연산을 활용하는 것이 성능 면에서 유리합니다.