본문 바로가기
목차
Python/pandas

[Pandas] 값 변경하기 - replace

by ds31x 2025. 8. 22.
728x90
반응형

https://datascienceparichay.com/article/pandas-replace-values-in-a-dataframe/

1. replace() 메서드

  • Value-based Replacement(값 기반 치환) 임을 기억!: Index-based 아님
  • Scope(적용 범위):
    • DataFrame
    • Series
  • 주요 활용:
    • Data Cleaning(데이터 정제),
    • Missing Value Handling(결측치 처리),
    • Label Normalization(라벨 통일),
    • Outlier Handling(이상치 처리)
  • Return Value:
    • 기본적으로 New Object(새 객체) 반환
    • inplace=True 지정 시 Original Object(원본 객체) 수정 

2. Signature

DataFrame.replace(
    to_replace=None,
    value=None,
    inplace=False,
    limit=None,
    regex=False,
    method='pad'
)

Series.replace(
    to_replace=None,
    value=None,
    inplace=False,
    limit=None,
    regex=False,
    method='pad'
)
  • to_replace: Replace Target Value(치환 대상 값)
    • Scalar(스칼라)
    • list
    • dict
    • Regex(정규표현식) 가능
  • value: Replacement Value(대체 값)
    • to_replace 와 매핑되는 값
  • inplace: In-place Update(원본 수정) 여부 (기본 False)
  • limit: Fill Limit(채움 한도)
    • method 사용 시 연속 구간 최대 채움 개수 제한
    • 일반 값 치환에는 적용되지 않음
  • regex: 정규표현식 사용 여부
    • 문자열 패턴 매칭 시 True 권장
  • method: Fill Method(채움 방식)
    • NaN(결측치) 치환 전용 옵션
      • 'pad'/'ffill': Forward Fill(앞 방향 채움)
      • 'bfill': Backward Fill(뒤 방향 채움)
    • 일반 값 치환에서는 무시됨

3. Quick Mental Model(핵심 개념)

  • DataFrame-level Replace: 여러 columns 동시에 처리 가능, column별 규칙 지정 가능
  • Series-level Replace(시리즈 레벨 치환): 특정 column만 치환
  • dict-based Multiple Mapping: DataFrame/Series 모두 가능
  • list Mapping(리스트 매핑):
    • to_replacevalue 모두 리스트 : 길이 일치 필수 (1:1 대응)
    • to_replace는 리스트, value는 단일 값 : 여러 값 → 하나의 값 매핑 가능
  • method: NaN 전용 옵션

4. Basic Usage on DataFrame(DataFrame 기본 사용법)

import pandas as pd

df = pd.DataFrame({
    "A": [1, 2, 3, 4],
    "B": ["cat", "dog", "cat", "mouse"],
    "C": [10, 20, 30, 40]
})

# 1) Single Value Replacement(단일 값 치환)
df1 = df.replace(1, 100)  

# 2) Multiple Value Replacement with Lists(리스트 기반 다중 치환, 1:1 대응)
df2 = df.replace([1, 2], [100, 200])  

# 3) Multiple Values → One Value(여러 값 → 하나의 값 치환)
df3 = df.replace([1, 2], 0)  

# 4) Frame-wide Dict Mapping(프레임 전체 딕셔너리 매핑)
df4 = df.replace({"dog": "puppy", 10: 999})  

# 5) Column-wise Nested Dict Mapping(컬럼별 중첩 딕셔너리 매핑)
df5 = df.replace({"A": {1: 100, 4: 400}, "B": {"cat": "kitten"}})  

# 6) Regex-based Replacement(정규표현식 치환)
df6 = df.replace({"B": {r"^c.*": "animal"}}, regex=True)  

5. Usage on Series (특정 열 국소 치환)

df_ser = df.copy()

# Single Value(단일 값 치환)
df_ser["B"] = df_ser["B"].replace("cat", "kitten")

# dict-based Multiple Mapping
df_ser["B"] = df_ser["B"].replace({"dog": "puppy", "mouse": "hamster"})

# Regex-based Replacement
df_ser["B"] = df_ser["B"].replace(r"^kit.*", "baby cat", regex=True)

#  In-place Replacement(가독성상 대입 권장)
df_ser["A"].replace({1: 100, 4: 400}, inplace=True)

6. dict-based Multiple Mapping Patterns

  • DataFrame-wide Mapping(프레임 전체): df.replace({old:new, ...})
  • Column-wise Nested Mapping: df.replace({"ColA": {old:new}, "ColB": {old:new}})
  • Series-specific Mapping(시리즈 전용): df["Col"].replace({old:new, ...})

7. NaN 치환 시 method 활용

import numpy as np

df_nan = pd.DataFrame({"A": [1, np.nan, 3, np.nan, 5]})

# Forward Fill(앞 방향 채움)
df_ffill = df_nan.replace(to_replace=np.nan, method="ffill")

# Backward Fill(뒤 방향 채움)
df_bfill = df_nan.replace(to_replace=np.nan, method="bfill")

# 일반 값 치환에 method 사용 → 무시됨
df_val = df_nan.replace(to_replace=1, method="ffill")  # 변화 없음

8. fillna 와의 차이

  • replace(): 범용 값 치환 도구 — NaN 포함 모든 값 치환 가능
  • fillna(): NaN 전용 도구 — 오직 NaN만 처리
  • replace(method=...): NaN일 때만 의미, 일반 값 치환에는 무시됨
  • fillna(method=...): NaN을 ffill/bfill로 채우는 대표적 방식

Example(예제 코드)

df = pd.DataFrame({
    "A": [1, np.nan, 3, np.nan, 5],
    "B": ["cat", "dog", None, "cat", "mouse"]
})

# [1] replace(): NaN 포함, 임의의 값도 치환 가능
df_r = df.replace({"A": {1: 100}, "B": {None: "NA"}})

# [2] replace() + method: NaN을 ffill로 채움
df_r_ffill = df.replace(to_replace=np.nan, method="ffill")

# [3] fillna(): 오직 NaN만 채움
df_f = df.copy()
df_f["B"] = df_f["B"].fillna("MISSING")              
df_f["A"] = df_f["A"].fillna(df_f["A"].mean())       

# [4] fillna() + method: NaN을 ffill + limit 적용
df_f_ffill_limit = df["A"].fillna(method="ffill", limit=1)

9. Gotchas and Best Practices

  • Value-based Replacement
  • List Mapping(리스트 매핑):
    • to_replacevalue 모두 리스트: 길이 일치 필수 (1:1 대응)
    • to_replace만 리스트, value 단일 값: 여러 값 → 하나의 값 치환 가능
  • Regex Keys(정규식 키): regex=True 명시 권장
  • Chained Indexing(체인 인덱싱): 피하기, 대입(assign) 방식 권장
    • Pandas는 체인 인덱싱 결과가 원본 DataFrame의 뷰(View)인지 복사본(Copy)인지 보장하지 않음.
    • df[...] [...]처럼 두 번 연속 인덱싱하는 chained indexing의 경우 SettingWithCopyWarning 이 발생함.
    • 가급적 loc 또는 iloc을 통한 인덱서를 활용할 것.
  • inplace=True : 과용 지양, 가독성 위해 대입 방식 선호
  • method: NaN 전용 옵션, 일반 값 치환에는 무시됨

 

728x90