방대한 양의 데이터프레임을 처리하다보면 이 데이터 요소를 저 데이터로 바꾸고 싶은데 노가다를 하기엔 끝이 안 보일 때가 있다 그럴 때 쓰는 게 pandas 라이브러리의 replace 함수.
replace 함수의 기능을 살펴보면 "Replace values given in `to_replace` with `value`."라고 나와있다.
바꿀 값과 그 값을 대체할 값을 차례로 써주면 된다.
사실 값을 바꾸는 건 '.loc'나 '.iloc' 매소드에 조건문을 넣어주며 바꿀 수도 있는데 얘네는 바꿀 값의 location을 필요로 해서 replace와 좀 다르게 작동한다.
이렇게 .loc을 쓰면 boolean과 label을 쓰며 위치를 인식해줘야 했던 것을
replace를 쓰면 치환대상이 많더라도 간단하게 치환할 수 있따.
일단 학생들의 과목점수를 나타내는 데이터프레임을 만들었다.
import pandas as pd
names = ['sooyoung', 'doyoon', 'hakjoon', 'jieun', 'yerim']
english_scores = [82, 95, 77, 82, 70]
math_scores = [45, 71, 96, 93, 80]
favorite_subjects = ['math', 'english', 'english', 'math', 'math']
dict = {
'name' : names,
'english score' : english_scores,
'math score' : math_scores,
'favorite' : favorite_subjects
}
df = pd.DataFrame(dict)
df
df.replace('math','science')
모든 'math' 값들이 'science'로 바뀌었다.
한 번에 여러 개의 문자열을 치환할 수도 있다.
df.replace({'math':'mh','english':'eng'})
딕셔너리 타입으로 여러 개의 문자열을 치환할 수 있다.
딕서녀리 기본 형태는 { key : value } 라서 치환 대상과 치환 값을 짝지어서 써준다.
df. replace(['math','english'],['mh','eng'])
# df.replace(['math','mh'],['english','eng','art']) --> error!
리스트 타입은 딕셔너리와 다르게 한 리스트 안에 치환 대상과 치환값을 짝지어 넣는 게 아니라
list1[0]=list2[0], list1[1]=list2[1] 이렇게 리스트 간 같은 인덱스 번호끼리 짝지어진다. 0번 인덱스는 0번 인덱스끼리, 1번 인덱스는 1번 인덱스끼리.
그래서 리스트 타입에서 치환할 대상과 치환 값의 숫자, 즉 사이즈가 맞지 않으면 오류가 난다.
df.replace(['math','english'],'Nocomment')
하지만 여러 개의 치환대상을 하나의 치환값으로 동시에 바꿀 순 있다.
리스트 대 리스트가 아니라 리스트 대 문자열이라 알맞게 인식하나보다.
물론 숫자도 치환 가능하다. 모든 82 값을 79로 바꿨다.
df.replace(82,79)
df.replace([82,77],[79,71],inplace=True)
# or
# df.replace({82 : 79},{77 : 71})
df
숫자도 리스트 타입, 딕셔너리 타입으로 여러 개 치환이 가능하다.
그리고 replace 함수도 inplace=True 를 해줘야 원본 DataFrame도 치환된다. 아니면 원본 데이터가 아닌 다른 공간에 치환된 값이 할당되기 때문이다.
특정 컬럼의 값만 바꾸고 싶을 때에는 컬럼명을 지정해줘서 값을 할당해주는 게 가능하다.
df.replace({'math score' : {71 : 81}})
# or
# df.replace({'math score' : 71}, 81)
원본df에선 'english score'와 'math score' 두 컬럼값에 71이 있었지만 'math score'의 71만 81로 바뀌었다.
여러 컬럼의 값을 하나의 값으로 치환할 수도 있다.
df.replace({'english score':[95,70],'math score':80},'100')
'english score' 컬럼의 95, 70과 'math score' 컬럼의 80을 모두 100점으로 바꾸고 싶을 땐 이렇게.
치환대상을 하나의 딕셔너리로 묶어주고 그 뒤에 치환값을 써줬다.
수동광고44444444444444444
replace 함수는 한 번에 여러 개의 값을 치환하는 게 가능하니
딕셔너리 타입과 리스트 타입을 적절히 사용해주고 짝을 맞춰주면 오류없이 치환할 수 있을 것이다 !
그리고 pandas.Series도 데이터프레임과 동일하게 replace가 작동한다고 한다.
'Programming > python' 카테고리의 다른 글
웹에서 YAML 파일 가져오고 dataframe 으로 나타내기 (0) | 2021.11.04 |
---|---|
파이썬 pandas.melt() 데이터 재구조화(reshape) ( melt vs pivot ) (0) | 2021.10.13 |
웹 사이트 주소 이해하고 requests와 BeautifulSoup으로 웹 크롤링 실습 (0) | 2021.08.02 |
파이썬 python matplotlib 으로 노년 구직자의 희망직종명 파이차트 그리기-2 (0) | 2021.07.22 |
파이썬 python drop, rename, isin 함수로 데이터 정제하기 -1 (0) | 2021.07.19 |