묭동이 개발 블로그
  • [Pandas] manipulate textual data(문자형 데이터 다루기)
    2024년 01월 06일 11시 18분 50초에 업로드 된 글입니다.
    작성자: 묭동이

     

    안녕하세요 이번 글에서는 pandas library를 활용하여 문자형 데이터를 다루는 것을 알아보겠습니다

     

    먼저 필요한 라이브러리를 불러옵니다.

    • pandas 라이브러리만 사용할 것이므로 import pandas as pd 코드를 상단에 작성 후 컴파일 해줍니다.

     

    이후 pandas 라이브러리의 read_csv 메소드를 사용하여 데이터셋을 불러옵니다.

    • 데이터셋을 URL 혹은 웹주소로 가져올 수 있는데요, 아래와 같이 "" 안에 URL or 웹 주소를 작성해주신 후 컴파일  해주시면 됩니다
    • 이후, 불러온 titanic 데이터를 출력하여 데이터가 잘 불러와졌는지 확인합니다 


    .str.lower() 메소드

    • Series.str.lower() 메소드는  특정 칼럼의 데이터 값을 소문자로 바꿉니다

     


    .str.upper() 메소드

    • Series.str.upper() 메소드는  특정 칼럼의 데이터 값을 대문자로 바꿉니다


    .str.split() 메소드

    • python 문법의 split과 유사
    • .str.split() 메소드는 문자열을 지정된 구분자(delimiter)를 기준으로 나누어 여러 부분으로 분리할 때 사용합니다.
    • 텍스트 데이터를 효율적으로 처리할 때 유용하며, 특히 데이터 정제 및 변환 과정에서 자주 사용합니다


    .str.get() 메소드

    • .str.get() 메소드는 문자열이 담긴 시리즈(Series) 또는 데이터프레임(DataFrame)의 각 요소에서 특정 위치의 문자 또는 부분 문자열을 가져오는 데 사용합니다. 
    • 이 메소드는 .str 속성을 통해 문자열 메소드에 접근한 후, 정수 인덱스를 사용하여 특정 위치의 문자를 추출할 수 있게 해줍니다.
    • split을 통해 ,로 Name 필드의 데이터를 분리한 후 가장 앞에 있는 '성'을 의미하는 'Surname' 열을 만든 후, Name 열의 첫번째(= 0번 index) 값을 넣어줍니다.


    .str.contains() 메소드

    • .str.contains() 메소드는 Series나 DataFrame의 각 문자열 요소에서 주어진 패턴이나 문자열이 포함되어 있는지 여부를 확인하는 데 사용합니다.
    • 주어진 패턴이나 문자열이 해당 요소에 존재하는지를 검사하고, 부울 값(True 또는 False)으로 이루어진 Series나 DataFrame을 반환합니다.
    • 대소문자를 구분하지 않는 경우 case=False 옵션을 주시면 됩니다.
      • Ex) .str.contains('Countess', case=False)

     

    아래 예시는 .str.contains() 메소드를 사용하여 Name 칼럼에 Countess 값이 있는 레코드를 반환하는 코드입니다.


    .str.len() 메소드

    • .str.len() 메소드는 Series나 DataFrame의 각 문자열 요소의 길이를 반환합니다.
    • 각 문자열의 문자 개수를 계산하여 해당 개수를 포함하는 새로운 Series나 DataFrame을 반환합니다.


    .str.len().idmax() 메소드

    • .str.len() 메소드를 통해 각 문자열 요소의 길이를 계산한 후 .idxmax() 메소드는 계산한 길이 중 최대값을 갖는 요소의 인덱스를 반환합니다.
    • 즉, .str.len().idxmax()는 문자열 길이가 가장 긴 요소의 인덱스를 찾는 데 사용됩니다.

     

    아래 코드는 'Name' 칼럼의 데이터 중 이름이 가장 긴 데이터를 출력하는 코드입니다.

    행 조건으로 titanic['Name'].str.len().idmax()를 주어 Name 필드의 길이가 가장 긴 인덱스를 가져온 후, 열 조건으로 Name 필드만 주어 조건을 만족하는 데이터만 가져옵니다.


    .replace() 메소드

    • .replace() 메소드는 문자열이나 값들을 다른 값으로 대체하는 데 사용합니다.

    .replace() 메소드의 사용법을 'Sex' 열의 값을 특정 값(male -> M, female -> F)으로 바꾼 데이터를 저장하는 새로운 열('Sex_short') 을 만드는 예시를 통해 익혀보겠습니다.

     

    먼저 'Sex' 열에 있는 데이터를 확인합니다.

    '성별'에 관한 데이터이므로 male, femal 두 개의 데이터만 들어있는 것을 확인할 수 있습니다.

     

    • 먼저 titanic DataFrame에서 'Sex' 열을 선택합니다.
      • titanic['Sex']
    • 이후 replace 메소드를 사용하여 'Sex' 열의 값을 변경합니다.
      • .replace({'male' : 'M', 'female' : 'F'})
      • 이때 {'male' : 'M', 'female' : 'F'}는 Python의 딕셔너리로, 'male'을 'M'으로, 'female'을 'F'로 대체하라는 의미입니다.
    • 마지막으로 변경된 데이터를 'Sex_short'라는 새로운 열에 저장합니다. 
      • titanic['Sex_short'] = titanic['Sex'].replace({'male' : 'M', 'female' : 'F'})
      • 즉, 'Sex' 열의 각 값이 'M' 또는 'F'로 변환되어 'Sex_short' 열에 저장됩니다. 

     

    * 주의사항 *

    공식문서에서는 특정 문자셋을 대체하기 위해 사용할 수 있는 다른 방법을 알려주고 있으나, 권장하는 방식은 아니라고 합니다.

    번거로우며 쉽게 실수로 이어질 수 있고 코드의 순서가 변경되면 데이터의 값이 바뀌는 문제가 발생할 수 있기 때문입니다.

     

     

    예시를 통해 살펴보겠습니다.

    순서를 바꿨을 때 발생하는 문제

     

    우리가 원하는 작업은 male -> M, female -> F로 바꾸는 것입니다.

    그러나, female의 male이 'M'으로 먼저 변경되어 feM이 되는 문제가 발생합니다.

    이러한 문제를 방지하기 위해 .replace() 메소드에 딕셔너리를 사용하여 한 번의 호출로 여러 교체를 수행하는 것을 권장한다고 생각합니다.

     

    틀린 부분 댓글로 작성해주시면 감사하겠습니다 😊

     

    Reference

    https://pandas.pydata.org/docs/getting_started/intro_tutorials/10_text_data.html

     

    How to manipulate textual data — pandas 2.1.4 documentation

    This tutorial uses the Titanic data set, stored as CSV. The data consists of the following data columns: PassengerId: Id of every passenger. Survived: Indication whether passenger survived. 0 for yes and 1 for no. Pclass: One out of the 3 ticket classes: C

    pandas.pydata.org

     

    댓글