본문 바로가기
Programming/python

파이썬 python replace 함수 치환

by 조창대 2021. 9. 29.
반응형

방대한 양의 데이터프레임을 처리하다보면 이 데이터 요소를 저 데이터로 바꾸고 싶은데 노가다를 하기엔 끝이 안 보일 때가 있다 그럴 때 쓰는 게 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가 작동한다고 한다.

 

 

 

반응형