본문 바로가기
Python 파이썬/pandas

pandas ) 특정 요소 변경 replace() 함수

by 하이방가루 2022. 4. 12.
728x90
반응형

DataFrame/Series.replace(to_replace=None, value=NoDefault.no_default, inplace=False, limit=None,regex=False, method=NoDefault.no_default)

to_replace의 값을 value로 대체한다.

시리즈의 값들을 다른 값들로 유동적으로 대체한다.

업데이트해야할 위치를 지정해야하는 .loc 또는 .iloc와는 다르다.

매개변수

to_replace : str(문자열), regex(정규 표현식), list(리스트), dict(딕셔너리), Series(시리즈), int(정수형), float(실수형), None

대체될 값을 찾는 방법이다.

  • 숫자형, 문자열 or 정규 표현식:
    • 숫자형numeric : 같은 값을 갖는 숫자를 value의 값으로 바뀐다.
    • 문자열str : to_replace과 정확히 일치하는 문자열이 value의 값으로 바뀐다.
    • 정규 표현식regex : to_replace의 정규 표현식과 일치하는 요소를 value의 값으로 바뀐다.
      • 예제는 마지막에 있다.
>>> s = pd.Series([1, 2, 3, 4, 5])
>>> s.replace(1, 5)
0    5
1    2
2    3
3    4
4    5
dtype: int64
>>> df = pd.DataFrame({'A': [0, 1, 2, 3, 4],
...                    'B': [5, 6, 7, 8, 9],
...                    'C': ['a', 'b', 'c', 'd', 'e']})
>>> df.replace(0, 5)
    A  B  C
0  5  5  a
1  1  6  b
2  2  7  c
3  3  8  d
4  4  9  e
  • 리스트list:
    • to_replace와 value 모두 리스트형일 경우, 두 매개변수의 리스트 길이가 같아야 한다.
    • regex=True인 경우 두 목록의 모든 문자열은 정규식으로 해석된다. 
    • regex=False(default)인 경우 두 목록은 짝을 이루어 대체된다. 대체가능한 정규식이 몇 개 없기 때문에 value는 많이 주요하진 않다.
>>> df = pd.DataFrame({'A': [0, 1, 2, 3, 4],
...                    'B': [5, 6, 7, 8, 9],
...                    'C': ['a', 'b', 'c', 'd', 'e']})
>>> df.replace([0, 1, 2, 3], 4)
    A  B  C
0  4  5  a
1  4  6  b
2  4  7  c
3  4  8  d
4  4  9  e
>>> df.replace([0, 1, 2, 3], [4, 3, 2, 1])
    A  B  C
0  4  5  a
1  3  6  b
2  2  7  c
3  1  8  d
4  4  9  e
  • 딕셔너리dict:
    • 딕셔너리를 사용하면 여러 종류의 기존 값을 다른 대체 값으로 지정할 수 있다
      • 예를 들어, {'a': 'b', 'y': 'z'}는 ‘a’를 ‘b’로 대체하고 ‘y’를 ‘z’로 대체한다.
    • 시리즈Series에 딕셔너리를 사용하기 위해서는 value 매개변수가 None이어야 한다.
    • 데이터프레임DataFrame에서 딕셔너리는 여러 열에서 여러 값들을 대체할 수 있다.
      • 예를 들어, {'a': 1, 'b': 'z'}는 ‘a’열에서 1을 찾고 ‘b’열에서 'z'를 찾아서 이 값들을 value매개변수에서 지정한 값으로 대체할 수 있다.
    • 데이터프레임에서 {'a': {'b': np.nan}}와 같이 중첩 딕셔너리를 사용할 경우, ‘a’열에서 ‘b’값을 찾아서 NaN으로 대체한다.
      • 중첩 딕셔너리를 사용할 경우 value 매개변수는 None이어야 한다.
      • 정규 표현식 또한 중첩할 수 있다.
      • 하지만 열 이름(중첩 딕셔너리의 최 상위 키값)에 정규 표현식을 쓸 수는 없다.
>>> df = pd.DataFrame({'A': [0, 1, 2, 3, 4],
...                    'B': [5, 6, 7, 8, 9],
...                    'C': ['a', 'b', 'c', 'd', 'e']})
>>> df.replace({0: 10, 1: 100})
     A  B  C
0   10  5  a
1  100  6  b
2    2  7  c
3    3  8  d
4    4  9  e
>>> df.replace({'A': 0, 'B': 5}, 100)
     A    B  C
0  100  100  a
1    1    6  b
2    2    7  c
3    3    8  d
4    4    9  e
>>> df.replace({'A': {0: 100, 4: 400}})
     A  B  C
0  100  5  a
1    1  6  b
2    2  7  c
3    3  8  d
4  400  9  e
  • None:
    • 이 경우 regex 매개변수는 반드시 정규 표현식의 문자열, 또는 리스트, 딕셔너리, ndarray, 또는 Series여야 한다.
    • value도 None일 경우 regex 매개변수는 반드시 중첩 딕셔너리이거나 Series여야 한다.
>>> df.replace({0: 10, 1: 100})
     A  B  C
0   10  5  a
1  100  6  b
2    2  7  c
3    3  8  d
4    4  9  e

 

value 원시값scalar(정수, 실수 등), 딕셔너리dict, 리스트list, 문자열str, 정규표현식regex, default NoDefault.no_default

  to_replace와 짝을 이루어 대체될 값이다.

  데이터프레임DataFrame에서 value 매개변수가 딕셔너리일 경우, 각 열에 대체할 값을 지정할 수 있다. (딕셔너리에 없는 열은 대체하지 않는다.).

 

inplace 불리언 default False

  True일 경우, 객체에 작업을 수행하고 None을 반환한다.

 

limit 정수형 default None

  앞으로 또는 뒤로 채울 최대 크기 간격

 

regex 불리언 또는 to_replace와 같은 종류, default False

  to_replace와/또는 value를 정규 표현식으로 해석할지 여부인다.

  만약 regex=True일 경우 to_replace는 반드시 문자열이여야 한다.

  그 대신에 regex의 값이 정규 표현식 또는 정규 표현식의 리스트, 딕셔너리, 배열일 경우 to_replace는 반드시 None(default)이여야 한다.

 

method {‘pad’, ‘ffill’, ‘bfill’, None} 중 하나

  to_replace가 원시값, 리스트 또는 튜플이고 value가 None일 때, 교체시 사용하는 방법이다. 

  • pad/ffill : 앞의 것으로 채운다.
  • bfill : 뒤의 것으로 채운다. 
>>> s = pd.Series([1, 2, 3, 4, 5])
>>> s.replace([1, 2], method='bfill')
0    3
1    3
2    3
3    4
4    5
dtype: int64

 

반환하는 것

  교체된 객체

 

발생할 수 있는 에러

RaisesAssertionError

  • regex가 불리언이 아니고 to_replace가 None이 아닐 경우

TypeError

  • to_replace가 원시값, 배열종류(리스트, ndarray, ...), 딕셔너리, 또는 None이 아닐 경우
  • to_replace가 딕셔너리이고 value가 리스트, 딕셔너리, ndarray(넘파이배열), 또는 Series(판다스)가 아닐 경우
  • to_replace가 None일 때 regex가 정규표현식 또는 리스트, 딕셔너리, ndarray, 또는 Series가 아닐 경우
  • value의 교체할 값의 자료형이 to_replace의 교체될 자료형과 일치하지 않을 경우

ValueError

  • to_replace와 value가 리스트이거나 ndarray일 때 두 변수의 길이가 다를 경우

 

주석

  • 정규 표현식은 문자열만 대체한다. 예를 들어, 부동 소수점 숫자와 일치하거나 데이터프레임 열이 숫자형의 dtype일 경우 정규 표현식을 지원하지 않는다.
  • 하지만, 부동 소수점 숫자가 문자열일 경우 정규 표현식으로 대체할 수 있다.
  • 따라서, 숫자형 데이터에 정규표현식을 적용하려면 먼저 astype() 함수로 문자열로 바꾼 뒤 정규 표현식을 적용하여야 한다.

 

매개변수에 정규표현식 사용 예제
>>> df = pd.DataFrame({'A': ['bat', 'foo', 'bait'],
...                    'B': ['abc', 'bar', 'xyz']})
>>> df.replace(to_replace=r'^ba.$', value='new', regex=True)
     A    B
0   new  abc
1   foo  new
2  bait  xyz
>>> df.replace({'A': r'^ba.$'}, {'A': 'new'}, regex=True)
     A    B
0   new  abc
1   foo  bar
2  bait  xyz
>>> df.replace(regex=r'^ba.$', value='new')
        A    B
0   new  abc
1   foo  new
2  bait  xyz
>>> df.replace(regex={r'^ba.$': 'new', 'foo': 'xyz'})
     A    B
0   new  abc
1   xyz  new
2  bait  xyz
>>> df.replace(regex=[r'^ba.$', 'foo'], value='new')
     A    B
0   new  abc
1   new  new
2  bait  xyz

 

s.replace({'a':None}) vs s.replace('a') vs s.replace('a',None) 동작 비교

>>> s = pd.Series([10, 'a', 'a', 'b', 'a'])

to_replace매개변수에 딕셔너리로 값을 전해줄 경우, 딕셔너리의 값(들)은 value 매개변수가 된다.

즉, s.replace({'a': None})는 s.replace(to_replace={'a': None}, value=None, method=None)와 같다.

>>> s.replace({'a': None})
0      10
1    None
2    None
3       b
4    None
dtype: object

value매개변수에 값을 명확하게 전해주지 않고 to_replace매개변수가 원시값scalar, 리스트list 또는 튜플tuple일 경우, replace 함수는 method매개변수(default ‘pad’)를 사용하여 대체한다.

그래서 이 경우 'a'요소의 이전 값으로 대체된다.

따라서 1번, 2번 행은 10으로 4번 행은 'b'로 대체됐다.

>>> s.replace('a')
0    10
1    10
2    10
3     b
4     b
dtype: object

다른 한편으로, value 매개변수에 None이 전해질 경우, None으로 대체된다.

>>> s.replace('a', None)
0      10
1    None
2    None
3       b
4    None
dtype: object

 

728x90
반응형

댓글