본문 바로가기

언어/Python

[Python] Python(파이썬) 문자열을 처리하는 다양한 방법!

Pandas 데이터 타입

Pandas dtype 설명
object 문자열 타입
int64 정수 타입
float64 부동 소수점 실수 타입
bool 불리언 타입
datatime64 Datatime 타입
timedelta [ns] 두 datatime 간의 차이
category 카테고리 목적의 문자열

Pandas의 데이터 타입은 Pandas dtype으로 불린다.

 

시작하기 전 import 설정

import pandas as pd

 

df = pd.read_excel('data/list.xlsx', index_col='id')
print(df.shape)
df.head()

dataframe의 다양한 열들을 처리할 수 있다.

 

df['name']

여러 열의 항목들 중에 'name'을 출력해보면 dtype이 'object'인 것을 확인할 수 있다. 따라서 'name' 열은 문자열로서 지정이 되어 있다.

 

df['name'].str[0]

앞서 확인한 'name' 열을 문자열로서 쓰겠다는 형식으로 str을 사용하고 파이썬 문자열에서 슬라이싱 및 인덱스 문법으로 각각의 문자를 읽어올 수 있다. 따라서 예제 코드와 같이 사용하면 지정한 열에 대해 첫 번째 문자를 읽어올 수 있다.

 

df['name'].str[:10]

만약 위의 예제코드와 같이 ':10'을 쓴다면 10개의 문자를 읽어올 수 있다. 따라서 위와 같은 방법을 쓰면 문자 단위 참조가 가능하다.

 

df['name'].str.split()

단어 단위 참조를 위해 split을 사용하여 문자열을 처리할 수도 있다. 위의 예제 코드를 사용하면 시리즈 형태임을 확인할 수 있고 시리즈 안에서 리스트로 나뉘어져 값이 할당된 것도 알수 있다. 

 

df['name'].str.split?

파이썬에서 split 함수를 사용할 때 구분자를 사용할 수 있다. maxsplit은 최대 몇 개까지 split을 수행할 것인지 지정하는 옵션이다. 예를 들어 -1은 모두 지정, 1은 1개까지만 지정한다.

 

df['name'].str.split(expand=True)

expand 옵션을 사용한 후 결과를 보면 이전과는 다르게 시리즈 형태가 아닌 dataframe 형태를 보여준다. 특정한 인자를 지정하지 않으면 whitespace(공백)을 기준으로 split됨을 확인 가능하다.

 

df['name'].str.split(expand=True)[[0,1]]

참조하고자 하는 단어의 인덱스를 보고 문자열을 단어 단위로 처리할 수 있다. 다수의 열을 처리하는 것도 예제 코드와 같이 가능하다.

 

cond = df['name'].str.startswith('여')
df[cond]

어떠한 특정 글자로 시작하는지 판단하고 싶을 때가 있다. 그럴때는 파이썬 문자열 타입에서 지원하는 함수와 똑같은 startswith 함수를 사용한다. 위의 예제 코드는 여로 시작하는 'name'의 dataframe를 출력해준다.

 

cond = df['name'].str.endswith('E')
df[cond]

endswith를 사용하면 startswith와는 반대로 끝 문자를 보고 포함되는 dataframe를 확인할 수 있다.

 

cond = df['name'].str.contains('하')
df[cond]

시작과 끝을 판단하는 것보다 조금 더 유용한 함수로서 contains를 사용할 수도 있다. 이 함수는 해당 문자열이 포함되어 있으면 모두 dataframe으로 확인 가능하다.

 

df['name'].str.count('여')

count 함수를 사용하여 해당 문자열이 몇 번이나 포함되었는지 숫자를 확인할 수 있다. 위의 예제 코드를 사용하면 각각의 'name'별로 몇 번이나 '여'가 포함되었는지 나타난다. 해당 결과를 별도의 열을 생성하고 저장할 수도 있다.

 

df['name'] = df['name'].str.strip()
# lstrip 좌측 공백 제거
# rstrip 우측 공백 제거

데이터에 따라서 좌측 및 우측에 공백이 있는 경우가 있기 때문에 제거할 필요가 있다. 이럴 때 strip 함수를 사용하면 된다. 위의 예제 코드를 사용하면 좌우 공백이 제거된 dataframe을 name에 저장할 수 있다.

추가로 'lstrip'은 좌측 공백만 삭제하고 'rstrip'은 우측 공백만 삭제한다.

 

df['name'] = df['name'].str.lstrip('!')
df['name']

만약 공백이 아닌 특정 문자열을 제거하고 싶다면 strip 안에 인자를 넣으면 된다. 인자를 생략하면 공백이 제거된다.

 

df['name'] = df['name'].str.lower()
df['name']

만약 문자열을 모두 소문자로 변경하고 싶다면 lower 함수를 사용하면 된다. 위의 예제 코드와 같이 대문자는 모두 소문자로 변경됨을 확인할 수 있다.

 

df['name'] = df['name'].str.upper()
df['name']

반대로 문자열을 모두 대문자로 변경하고 싶다면 upper 함수를 사용하면 된다. 위의 예제 코드와 같이 소문자는 모두 대문자로 변경됨을 확인할 수 있다.

 

df['name_fixed'] = df['name'].str.replace('LOVE', '사랑')
df.head()

파이썬 문자열에 대해 많이 사용하는 함수들이 Pandas 시리즈에서도 모두 지원 가능하다. replace 함수를 사용하면 문자열을 다른 문자열로 변환 가능하다. 문자열 패턴의 종류는 업무에 따라 다양하므로 새로운 열을 만들어서 새롭게 변경된 내용을 할당하면 된다.

 

def fn(val):
#     val = val.replace('.......')
    return len(val)

df['name_num'] = df['name'].apply(fn)
df.head()

지금까지 사용한 함수들이 요구사항에 맞지 않을 때는 직접 변환해야 한다. 그럴 때 유용하게 사용할 수 있는 함수는 apply이다. 위의 예제 코드처럼 apply를 사용할 때 직접 지정한 함수를 인자로 전달한다.

위의 예제 코드를 보면 return 값을 'name'의 글자수로 변환하여 새로운 열이 생성된 것을 확인할 수 있다.

 

결론

문자열 타입은 가장 자주 처리해야할 타입들 중 하나이며 일괄적으로 수정이 필요하거나 Excel 데이터 처리 시에 각각 다른 정책을 반영해야 할수도 있다. 파이썬을 사용하면 Excel에서 하나씩 변환하고 처리하는 것보다 효율적으로 작업을 수행할 수 있다.