데이터분석 기초 | 문자 데이터 처리(object-dtype / StringDtype) | 정규 표현식 의미, 필수 문법, 함수 | 문자 수 세기 | split 함수 매개변수(pat, expand, regex)

    728x90

     

    1. 문자 데이터 처리

     

    ▶ 판다스_문자열 타입 2가지

    : object-dtype의 넘파이 배열, StringDtype 확장 타입
    : StringDtype으로 변환해서 사용하는 것이 좋음

     

    1-1) 라이브러리 설치 후 데이터셋 불러오기

     

    ▶ 라이브러리 설치 및 가져오기

    import pandas as pd
    import numpy as np

     

    ▶ 데이터셋 불러오기

    titanic = pd.read_csv('./datasets/titanic.csv')

     

    ▶ 데이터셋에서 필요없는 변수는 미리 제거하고 진행

    : PassengerId와 Cabin 변수 삭제

    titanic.drop(['PassengerId', 'Cabin'], axis=1, inplace=True)

     

     

    1-2) 문자열 데이터타입 변경하기

     

    ▶ 데이터 타입을 Object-dtype에서 String Dtype으로 변경

    : Name의 데이터타입은 object형(dtype('0'))

    : StringDtype으로 변경

    titanic.Name.dtype
    titanic['Name'] = titanic.Name.astype("string")

     

     

    1-3) split() 함수로 데이터값 나누기

     

    ▶ split으로 Name 값 나누기

    : 타이타닉 데이터의 Name 변수를 보면 2개 이상의 단어로 구성되어 있음

    : split() 함수로 단어 분리 

    titanic.Name.str.split()

     

    ▶ 매개변수 pat =

    : 분리에 사용된 기호(또는 공백)를 중심으로 단어를 분리할 때 

    titanic.Name.str.split(pat=",")

    : 쉼표(,)를 기준으로 분리 (쉼표가 사라지면서 분리됨)

     

    ▶ 매개변수 expand = True/False

    : 문자가 분리되는 만큼 개별 열이 생성됨

    : 가장 긴 문자 데이터가 분리되는 단어 수만큼 열이 생성됨

    : 따라서 단어 수가 적은 데이터는 나머지 공간이 빈 칸으로 채워짐

    titanic.Name.str.split(expand=True)


    ▶ 분리된 문자에 접근하는 방법

    : 이름은 데이터 분석에 의미가 없지만 앞에 불리는 호칭은 의미가 있을 것이라고 판단

    : 호칭 문자에 접근하려면 Name 값의 [1] 값을 가져와야 함. (0부터 시작)

    titanic.Name.str.split().str[1]

     

    ▶ 뽑아낸 호칭 값을 새로운 변수에 담아서 출력

    titanic['title'] = titanic.Name.str.split().str[1]
    titanic.head()

     


    2. 문자값 교체하기

     

    ▶ 데이터 값 개수 세보기

    titanic.title.value_counts().head()

     

    ▶ 매개변수 regex = True / False

    : 전달하는 문자 패턴에 정규 표현식을 사용할 때는 True (정규 표현식에 대해서는 하단에 설명)

    : 입력한 문자 그대로 전달할 때는 False

    : Mr. Miss. 뒤에 붙는 마침표(.)를 없애보기

    titanic.title.str.replace('.', '', regex = False)

    : 마침표(.)를 공백으로 처리

     

    ▶ 다시 출력해보기

    titanic['title'] = titanic.title.str.replace('.', '', regex=False)
    titanic.head()

     

    ▶ 데이터 값 개수 세보기

    titanic.title.value_counts()

     

    ▶ 호칭 정리하기

    : 같은 의미의 중복되는 단어 정리

    : 희귀 이름도 따로 정리

    titanic['title'] = titanic['title'].str.replace('Mlle', 'Miss', regex = False)
    titanic['title'] = titanic['title'].str.replace('Ms', 'Miss', regex = False)
    titanic['title'] = titanic['title'].str.replace('Mme', 'Mrs', regex = False)
    
    rare_name = ['Dr', 'Rev', 'y', 'Impe', 'Planke', 'Major', 'Gordon', 'Col', 'Jonkheer', 'the', 'Billiard', 'Don', 'Shawah', 
                 'Velde', 'Capt', 'Cruyssen', 'Mulder', 'Melkebeke', 'Steen', 'Walle', 'Messemaeker', 'der', 'Pelsmaeker', 'Carlo']
    titanic['title'] = titanic['title'].replace(rare_name, 'Rare', regex = False)
    titanic['title'].value_counts()

     


    3. 정규 표현식 가이드

     

    3-1) 정규 표현식이란?

     

    ▶ 정규 표현식

    : 문자의 패턴을 인식하고 검색하여 필요한 정보를 쉽게 식별하게 하거나 추출할 때 사용

    : 정규표현식을 많이 활용하는 작업 
        - 문자열에서 특정 단어를 검색하는 경우
        - 문자열에서 특정 패턴에 부합하는 단어를 검색하는 경우
        - 문자열에서 특정 단어와 기호를 변경하거나 교체하는 경우

    : 입력한 문자 그대로 찾을 수도 있지만 그렇게 하면 원하는 않는 문자도 포함 되어 추출될 수 있음

     

    ▶ Name에서 Mr 찾기

    titanic[titanic['Name'].str.contains('Mr')].head(10)

    >> Mr를 찾았는데 Mrs도 같이 나옴

    >> 이런 상황을 피하기 위해 정규 표현식을 사용함

     

     

    3-2) 정규 표현식 필수 문법

     

    ▶ 정규표현식 연습 사이트

    regexr.com 

     

    ▶ 정규 표현식 정리 블로그 소개

    https://yasic-or-nunch.tistory.com/47

     

    ◆ 그룹, 범위 관련 표현

    문자 / 기호 의미
    : 또는(or)     ex. a:b
    [ ] 문자 집합. 대괄호 안에 있는 어떤 문자라도 매치함   ex. [abc], [a-z]
    (?:) 검색은 하지만 기억하지는 않음
    ( ) 괄호 안의 문자열을 하나의 그룹 문자로 취급    ex. (abc)
    [^] 부정 문자 집합. 대괄호 안의 문자를 제외한 문자를 매치함   ex. [^abc], [^a-z]

     

    ◆ 양의 대소 표현

    문자 / 기호 의미
    . 1개의 임의 문자    ex. a. ,  .b
    * 앞의 문자가 무한 개로 존재하거나 없거나 문자가 0개 이상    ex. ab*c
    {n} 앞의 문자가 n번 반복    ex. ab{2}c
    {min, max} 앞의 문자가 최소 min, 최대 max만큼 반복, ?, *, +로 대체 가능    ex. ab{2, 8}c
    ? 앞에 문자가 있거나 없거나 문자가 0개 또는 1개     ex. ab?c
    + 앞에 문자가 최소 1개 이상 존재     ex. ab+c
    {min, } 앞의 문자가 최소 min만큼 반복     ex. a{2,}bc

     

    ◆ 경계와 위치 표현

    문자 / 기호 의미
    \b 문자 \b 문자의 경계 부분에 매치함    ex. \b
    ^ 뒤의 문자로 문자열 시작    ex. ^a
    \B 문자 \B 문자의 경계가 아닌 부분에 매치함
    $ 앞의 문자로 문자열이 종료    ex. a$

     

    ◆ 백슬래시 관련 자주 사용하는 표현

    문자 / 기호 의미
    \ 특수 문자가 아닌 문자
    \d 모든 숫자. [0-9]와 동일
    \w 모든 문자 또는 숫자/ [a-zA-Z0-9]와 동일
    \s 공백을 의미. [\t\n\r\f\v]와 동일
    \\ 백슬래시 문자 자체. 이것을 피하려면 정규 표현식 앞에 r을 사용함
    \D 숫자가 아닌 모든 문자. [^0-9]와 동일

    ◆ 정규표현식 처리가 가능한 문자열 관련 함수

    함수 의미
    count() 시리즈 / 인덱스의 각 문자열에서 패턴 발생 횟수 계산
    contains() 시리즈 / 인덱스의 문자열에 패턴 또는 정규 표현식이 포함되어 있는지 테스트. re.search()를 호출하고 bool 값 반환
    findall() 패턴 또는 정규 표현식의 모든 항목 검색. 모든 요소에 re.findall()을 적용하는 것과 동일
    split() str.split()과 동일하며 분할할 문자열 또는 정규 표현식을 허용
    replace() 검색 문자열이나 패턴을 주어진 값으로 변경
    extract() 정규 표현식 pat의 캡처 그룹을 DataFrame의 열로 추출하고 캡처된 그룹을 반환
    match() 각 문자열이 정규 표현식과 일치하는지 확인. re.match()를 호출하고 bool값 반환
    rsplit() str.rsplit()과 동일하며 시리즈 / 인덱스의 문자열을 끝에서 분할

     

     

    3-3) 정규 표현식 활용 예제

     

    ▶ ([A-Za-z]+)\.

    : 호칭을 의미하는 문자가 마침표(.) 왼쪽에 위치하는 패턴을 정규 표현식으로 표현한 것 

    : 판다스 extract() 함수로 이 패턴에 부합하는 값을 title 이라는 새로운 변수에 대입

    titanic['title'] = titanic.Name.str.extract(r'([A-Za-z]+)\.', expand = False)
    titanic.head()

     

    ▶ ^Z.*

    : 이름이 Z로 시작하는 승객의 데이터만 추출 

    : count() 함수로 각 문자열 요소에서 패턴의 발생 횟수를 세어서 특정 정규표현식 패턴이 포함된 데이터를 찾음

    titanic[titanic.Name.str.count('(^Z.*)') == 1]

    : == 1 코드에서 1은 True를 의미함

    titanic.Name.str.count('(^Z.*)').sum()

    : sum() 함수로 합계를 구함

     

    ▶ ^Y.*

    : 이름이 Y로 시작하는 승객의 데이터만 추출

    : match() 함수로 각 문자열이 정규 표현식과 일치하는 문자를 찾음

    titanic[titanic['Name'].str.match('^Y.*') == True]

     

    ▶ ^[cC].*

    : c랑 C로 시작하는 이름을 가진 승객의 데이터가 0보다 큰(1개 이상인) 데이터 추출

    titanic[titanic['Name'].str.count('^[cC].*') > 0]


    4. 문자 수 세기

     

    ▶ 글자 수 세기, 공백 포함

    : 정규 표현식 count() 함수는 문자 수를 셀 때 활용

    : Name 열에서 공백을 포함한 모든 문자 수를 셀 수 있음

    titanic['Name'].str.count('')

     

    ▶ 단어 수 세기, 공백 포함

    : 총 단어 수 = (단어 사이) 공백 수 + 1 

    titanic['Name'].str.count(' ') + 1

     

    ▶ 특정 문자 수 세기, 공백 포함

    titanic['Name'].str.count('a')

    728x90

    댓글