본문 바로가기
Kirrgong_코드 정보

파이썬 문자열 다루기(리스트, 데이터프레임)

by 키르공 2023. 4. 5.
반응형

파이썬에서 리스트, 데이터프레임을 다룰 때 인덱싱 혹은 슬라이싱은 상당히 자주 사용됩니다. 이번 포스팅에서는 그 중에서도 리스트 형태의 문자열과 데이터프레임 형태의 문자열을 대상으로 인덱싱하는 방법을 소개드리려고 합니다. 

 

리스트 형태 문자열 다루기 

1. 문자열 인덱싱

string= "hello python"
len(string)
Out[1]: 12

먼저 string이라는 변수에 "hello python"이라는 문자열을 정의하였습니다. 이렇게 변수 하나에 문자열을 입력했을때 이 변수는 리스트 형태로 설정됩니다. len()라는 함수로 이 리스트의 개수를 살펴보면 12로 출력된 걸 보실수 있습니다. 

string[0]
Out[3]: 'h'
string[1]
Out[4]: 'e'
string[2]
Out[5]: 'l'
string[3]
Out[6]: 'l'
string[4]
Out[7]: 'o'

string[0] + string[1] + string[2] + string[3] + string[4]
Out[13]: 'hello'

리스트에서 인덱싱을 하기 위해서는 '변수명'['숫자'] 입력해주시면 원하시는 문자열을 인덱싱 하실수 있습니다. 또한 개별 문자열을 +로 이어주면 분리되어 있는 문자열을 합치는 것도 가능합니다. 

 

2. 문자열 슬라이싱

리스트 형태의 문자열을 슬라이싱 하기위해서는 '변수명'['숫자1:숫자2']입력해주시면 원하시는 문자열을 슬라이싱할 수 있습니다. 여기서 숫자1은 입력하지 않으면 0으로 인식, 숫자 2를 입력하지 않으면 문자열 개수로 인식하게 됩니다. 또한 주의해야 할 점은 ":" 뒤의 숫자는 그 전 숫자까지 입력됩니다. 

string[:5]
Out[9]: 'hello'

string[1:5]
Out[10]: 'ello'

string[1:]
Out[11]: 'ello python'

첫번째 string[:5]를 살펴보면 0번째 문자열부터 4번째 문자열까지 한번에 출력하여 'hello'가 출력되었습니다. 

두번째 string[1:5]를 살펴보면 1번째 문자열부터 4번째 문자열까지 출력되어 'h'가 제외된 'ello'가 출력되었습니다.

세번째 string[1:]를 살펴보면, 1번째 문자열부터 마지막 문자열까지 출력되어 'ello python'이 출력되었습니다. 

 

이처럼 단순하게 하나의 문자열을 도출하는 것이 아니라면 슬라이싱 할때 숫자2 부분을 잘 고려하셔야 합니다.

 

3. 문자열 분리하기

리스트 형태의 문자열을 분리하기 위해서는 "split" 함수를 이용해야 합니다. 사용방법은 '변수'.split("기준이 될 문자")로 이용하실 수 있습니다. 

string.split(" ")
Out[13]: ['hello', 'python']

string.split(" ")[0]
Out[14]: 'hello'

string.split(" ")[1]
Out[15]: 'python'

string2="hello+pyhton"
string2.split("+")
Out[17]: ['hello', 'pyhton']

string은 "hello python"으로 정의되어 있으므로 " " 띄어쓰기를 기준으로 문자열을 분리하였습니다. 그 결과 'hello'와 'python'으로 구분되어 2개의 리스트 파일로 구성되었습니다. 이 상태에서 뒤에 인덱싱을 하게 되면 해당 리스트에서 첫번째, 두번째 값을 추출하실 수 있습니다. 

또 다른 예로 string2에 "hello+python"로 정의하였을 때, "+" 문자열을 기준으로 분리한 결과 마찬가지로 2개의 리스트 파일로 출력된 결과를 확인할 수 있습니다. 

 

데이터프레임 형태 문자열 다루기

1. 문자열 분리하기

데이터 프레임에서는 리스트 형태보다 문자열을 다루기가 생각보다 까다롭습니다. 앞서 언급해드린 방법으로는 리스트에 적용되기 때문에 데이터프레임에서는 "str" 함수를 한번 섞어주면 유사하게 사용할 수 있습니다. 

import pandas as pd

data=pd.DataFrame({'ID' :['a','b','c','d'] ,
                   'date' : ["2022-11-01","2022-12-05","2021-01-05","2023-04-05"]})
data
Out[4]: 
  ID        date
0  a  2022-11-01
1  b  2022-12-05
2  c  2021-01-05
3  d  2023-04-05

data['date'].str.split("-")
Out[5]: 
0    [2022, 11, 01]
1    [2022, 12, 05]
2    [2021, 01, 05]
3    [2023, 04, 05]
Name: date, dtype: object

먼저 데이터프레임을 다루기 위하여 pandas 모듈을 로딩하고, data라는 데이터프레임을 생성하였습니다. data에는 ID 라는 변수로 'a', 'b', 'c', 'd' 데이터 값을 입력하였고, date라는 변수로 4가지 날짜 값을 입력하였습니다. data['date'] 변수를 먼저 선택하여 .str 함수를 추가해주면 .split 함수로 리스트와 마찬가지로 문자열을 분리할 수 있습니다. 다만 리스트 형태의 문자열을 분리했을 때와 다른점은 하나의 리스트가 있는게 아니라, "-"를 기준으로 분리된 3개의 정보가 담긴 4개의 리스트가 생성된 것을 볼 수 있습니다. 

 

2. 분리된 리스트를 새로운 열로 데이터 받기

데이터프레임 형태의 문자열에서 분리된 리스트들 중에서 연도에 해당하는 값들을 선택하려고 한다고 가정을 해보겠습니다.  

data['date'].str.split("-")[0]
Out[6]: ['2022', '11', '01']

data['date'].str.split("-")[0][0]
Out[7]: '2022'

위에 코드와 같이 인덱싱을 해보지만 4개의 리스트가 잡히거나, 더 하위 항목으로 선택해야 하나의 값만 선택할 수 있습니다. 한번에 연도를 전부 받기 위해서는 다시 .str 함수와 함께 .get 함수를 이용하면 됩니다. 

data['date'].str.split("-").str.get(0)
Out[8]: 
0    2022
1    2022
2    2021
3    2023
Name: date, dtype: object

이렇게 분리한 연도 값을 데이터프레임의 새로운 열로 지정할 때는 다음과 같습니다. 

data['year']=data['date'].str.split("-").str.get(0)

data
Out[10]: 
  ID        date  year
0  a  2022-11-01  2022
1  b  2022-12-05  2022
2  c  2021-01-05  2021
3  d  2023-04-05  2023

 

리스트 형태의 문자열은 직관적이라 이해가 쉬울 것이라고 예상되지만, 데이터프레임에서의 문자열을 다루는 방식은 연습이 필요할 것으로 생각됩니다. 포스팅을 보시고 한번씩 연습해보시면 어려운 내용이 아니기 때문에 코드 작성하실때 활용하실 수 있을 것 같습니다. 

반응형

댓글