DoITgrow

[파이썬-Pandas] 데이터프레임(DataFrame) 내 하나의 문자열을 구분자로 나누어 여러 개의 컬럼으로 만드는 방법 본문

프로그래밍

[파이썬-Pandas] 데이터프레임(DataFrame) 내 하나의 문자열을 구분자로 나누어 여러 개의 컬럼으로 만드는 방법

김수성 (Kim SuSung) 2021. 12. 23. 17:41
반응형

안녕하세요. 오늘은 간단히 파이썬 Pandas(판다스) 패키지의 좋은 기능 하나를 소개해 드리려고 합니다. 데이터 분석을 위해서 거의 70% 이상의 시간을 데이터 전처리하는데 쓰는 거 같아요. 저는 이제 엑셀보다 파이썬 판다스가 편해서 엑셀을 잘 안열고, 판다스를 많이 사용하는 것 같아요. 그래도 아직 알아야한 기능들이 있어서 지속적으로 공부하는 것이 필요할 것 같네요. 

오늘은 문자열을 전처리하는 방법 중 하나로 문자열을 분리하는 방법을 소개드리려고 합니다. 데이터를 수집하다 보면 간혹 잘 분리되었지만 미처 분리되지 않고, 다른 구분자로 구분되어 있는 데이터 형태를 만날 수 있습니다. 예를들어 csv 파일을 콤마( , )로 구분하여 데이터프레임 형태로 얻었는데, 특정 부분은 콤마가 아닌 세미콜론( ; )으로 구분되어 있을 수도 있습니다. 만약에 이 부분도 분리하여 추가의 컬럼으로 만들고 싶다면 오늘 소개해 드리는 방법이 도움이 되실 것 같아요.

 

예시 데이터

오늘 소개드릴 방법을 실험해 보기 위해 간단히 아래와 같이 예시 데이터를 만들어 보겠습니다.

df = pd.DataFrame(
    {"이름":["A", "B", "C", "D"],
     "나이":["10", "15", "42", "22"],
     "주소":["서울;강동구", "인천;연수구", "안양;동안구", "부산;수영구"]}
)
  이름 나이 주소
0 A 10 서울;강동구
1 B 15 인천;연수구
2 C 42 안양;동안구
3 D 22 부산;수영구

위와 같은 예시 데이터가 있다고 가정해볼게요. 위와 같은 데이터를 누군가에에 받았는데 데이터를 만든 담당자가 주소 데이터를 시와 구를 세미콜론( ; )으로 구분을 해놓은 것입니다. 만약에 "~~구"를 기준으로 분석할 목적이라면 그대로 분석해도 괜찮지만 "~~시"를 기준으로 분석이 필요하다면 처리해서 분리를 해줘야 합니다. (분리하지 않으면 "서울;강동구;" 와 "서울;양천구"는 같은 서울이지만 컴퓨터가 다른 데이터로 판단할 것이기 때문이죠~)

방법 1. df['주소'].str.split(";", expand=True)

temp_df = df['주소'].str.split(";", expand=True).rename(columns={0:"주소(시)", 1:"주소(구)"})
df = pd.concat([df, temp_df], axis=1).drop('주소', axis=1)

▲ 가장 간단한 방법입니다. "주소" 컬럼을 가져와서 문자열을 처리하는 함수를 적용하여 세미콜론( ; )을 기준으로 분리합니다. 파라미터에 expand=True 를 넣어주게 되면 데이터프레임을 확장하여 결과를 리턴받게다는 의미입니다. 만약에 False로 할경우 그냥 분리된 문자열이 리스트에 담겨있는 Series 결과를 얻게 됩니다. 

이렇게 얻은 데이터프레임의 컬럼명은 기본적으로 0부터 시작하는 숫자로 자동 입력됩니다. 따라서 본인 데이터에 맞게 컬럼명을 변경해 줍니다.

마지막으로 pd.concat 함수를 통해 2개의 데이터프레임을 붙여주고, 기존에 분리되지 않은 주소 컬럼은 삭제해주도록 합니다.

방법 2. df['주소'].str.split(";").apply(lambda x: pd.Series(x))

temp_df = df['주소'].str.split(";").apply(lambda x: pd.Series(x)).rename(columns={0:"주소(시)", 1:"주소(구)"})
df = pd.concat([df, temp_df], axis=1).drop('주소', axis=1)

방법 3. pd.DataFrame(df['주소'].str.split(';').tolist())

temp_df = pd.DataFrame(df['주소'].str.split(';').tolist()).rename(columns={0:"주소(시)", 1:"주소(구)"})
df = pd.concat([df, temp_df], axis=1).drop('주소', axis=1)

위에 소개한 여러 방법 중 가장 간단한 방법 1만 알고 있어도 되지만 다른 방법의 동작원리도 한번 보신 다음에 혹시나 방법이 까먹을 경우 다른 방법을 기억해서 사용해 보시라고 함께 소개드렸습니다.

 

그럼 소개드린 방법이 유익하셨길 바라며, 다음에 뵐게요~

반응형
Comments