본문 바로가기
Python/Pandas

Pandas 텍스트 데이터 다루기

by 찐남 2021. 8. 21.
본 내용을 보기 전에 Python 사전 준비 및 Python 완전 기초를 먼저 이해하셔야 합니다.
본 포스팅은 pandas 공식 홈페이지를 기반으로 작성하였습니다.

 

이번 포스팅에서는 titanic 승객 데이터를 활용하겠습니다.

 

titanic.csv
0.06MB

 

import pandas as pd
titanic = pd.read_csv("D:/python_exer/titanic.csv")
titanic.head()

 

 

 

 

 

 

1. 텍스트 데이터 다루기

 

1.1. 모든 이름 문자를 소문자로 변경하기

 

titanic["Name"].str.lower()

 

 

이름 열의 각 문자열을 소문자로 만들려면 이름 열을 선택하고, str 접근자를 추가하여 lower 메서드를 적용합니다. 따라서 각 문자열은 요소별로 변환됩니다. str 접근자를 사용할 때 여러 특수 문자열 메서드를 사용할 수 있습니다. 이러한 메서드는 일반적으로 단일 요소에 대해 동등한 기본 제공 문자열 메서드와 일치하는 이름을 갖지만 열의 각 값에 대해 요소별로 적용됩니다. 

 

1.2. 쉼표 앞의 부분을 추출하여 승객의 성을 포함하는 새 column 생성하기

 

titanic["Name"].str.split(",")

 

 

Series.str.split() 메서드를 사용하면 각 값이 2개의 요소 목록으로 반환됩니다. 첫 번째 요소는 쉼표 앞의 부분이고 두 번째 요소는 쉼표 뒤의 부분입니다. 

 

titanic["Surname"] = titanic["Name"].str.split(",").str.get(0)
titanic["Surname"]

 

 

성을 나타내는 첫 번째 부분(요소 0)에만 관심이 있으므로 str 접근자를 다시 사용하고 Series.str.get()을 적용하여 관련 부분을 추출할 수 있습니다. 실제로 이러한 문자열 함수를 연결하여 한 번에 여러 함수를 결합할 수 있습니다.

 

 

 

 

1.3. 타이타닉호에 탑승한 백작부인에 대한 승객 데이터 추출하기

 

titanic["Name"].str.contains("Countess")

 

 

titanic[titanic["Name"].str.contains("Countess")]

 

 

문자열 메서드 Series.str.contains()는 문자열에 Countess라는 단어가 포함되어 있으면 Name 열의 각 값을 확인하고 각 값에 대해 True(Countess는 이름의 일부임) 또는 False(Countess는 일부가 아님)를 반환합니다. 조건부(부울) 인덱싱을 사용하여 데이터를 하위 선택하는 데 사용할 수 있습니다. 타이타닉에는 백작부인이 한 명뿐이었으므로 결과적으로 하나의 행을 얻습니다(Note: Series.str.contains() 및 Series.str.extract() 메서드가 정규식을 허용하지만 이번 포스팅에서는 다루지 않겠습니다.).

 

1.4. 타이타닉의 승객 중 가장 긴 이름을 가진 승객 추출하기

 

titanic["Name"].str.len()

 

 

가장 긴 이름을 얻으려면 먼저 이름 열에 있는 각 이름의 길이를 가져와야 합니다. pandas 문자열 메서드를 사용하여 Series.str.len() 함수가 각 이름에 개별적으로(요소별로) 적용됩니다. 

 

titanic["Name"].str.len().idxmax()

 

 

다음으로 이름 길이가 가장 긴 테이블에서 해당 위치, 정확하게는 인덱스 레이블을 가져와야 합니다. idxmax() 메서드는 정확히 그 작업을 수행합니다. 문자열 방식이 아니며 정수에 적용되므로 str을 사용하지 않습니다. 

 

titanic.loc[titanic["Name"].str.len().idxmax(), "Name"]

 

 

행(307)과 열(이름)의 인덱스 이름을 기반으로 부분 집합을 생성하기 위해 loc 연산자를 사용하였습니다. 

 

1.5. "Sex" 열에서 "male" 값을 "M"으로, "female" 값을 "F"로 교체

 

titanic["Sex_short"] = titanic["Sex"].replace({"male": "M", "female": "F"})

 

 

replace()는 문자열 메서드가 아니지만 매핑이나 어휘를 사용하여 특정 값을 변환하는 편리한 방법을 제공합니다. {from : to} 매핑을 정의는 딕셔너리 행태를 필요로 합니다.

 

(Warning: 특정 문자 집합을 대체하는 데 사용할 수 있는 replace() 메서드도 있습니다. 그러나 여러 값을 매핑하는 경우 다음과 같이 됩니다.)

 

titanic["Sex_short"] = titanic["Sex"].str.replace("female", "F")
titanic["Sex_short"] = titanic["Sex_short"].str.replace("male", "M")

 

이것은 번거롭고 쉽게 실수로 이어질 것입니다. 이 두 문장을 반대 순서로 적용하면 어떻게 될지 생각해 보세요. 

 

2. Remeber!

 

  • 문자열 메서드는 str 접근자를 사용하여 사용할 수 있습니다.
  • 문자열 메서드는 요소별로 작동하며 조건부 인덱싱에 사용할 수 있습니다.
  • replace 방법은 주어진 딕셔너리에 따라 값을 변환하는 편리한 방법입니다.

 

 

반응형

'Python > Pandas' 카테고리의 다른 글

Pandas 데이터 보기(Viewing)  (0) 2021.09.13
Pandas 객체 생성  (0) 2021.09.12
Pandas 시계열 데이터 다루기  (0) 2021.08.20
Pandas 활용 테이블 결합 방법  (0) 2021.08.19
Pandas 테이블 구조 변경 방법  (0) 2021.08.18

댓글