파이썬에서 리스트, 데이터프레임을 다룰 때 인덱싱 혹은 슬라이싱은 상당히 자주 사용됩니다. 이번 포스팅에서는 그 중에서도 리스트 형태의 문자열과 데이터프레임 형태의 문자열을 대상으로 인덱싱하는 방법을 소개드리려고 합니다.
리스트 형태 문자열 다루기
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
리스트 형태의 문자열은 직관적이라 이해가 쉬울 것이라고 예상되지만, 데이터프레임에서의 문자열을 다루는 방식은 연습이 필요할 것으로 생각됩니다. 포스팅을 보시고 한번씩 연습해보시면 어려운 내용이 아니기 때문에 코드 작성하실때 활용하실 수 있을 것 같습니다.
댓글