달나라 노트

Python Pandas : map 본문

Python/Python Pandas

Python Pandas : map

CosmosProject 2026. 5. 20. 21:54
728x90
반응형

Pandas map() — 딕셔너리·함수·Series로 값을 1:1 변환하는 메서드

map()은 Series의 각 값을 다른 값으로 변환하는 메서드입니다. 딕셔너리, 함수, 또는 다른 Series를 기준으로 element-wise 변환하며, 코드값을 레이블로 바꾸거나 외부 테이블 기준으로 값을 붙이는 작업에 가장 자주 씁니다.

주의: map()Series 전용입니다. DataFrame 전체에 적용하려면 apply() 또는 map()(pandas 2.1+)을 씁니다.

기본 문법

Series.map(arg, na_action=None)
파라미터 설명
arg 딕셔너리, 함수, Series 중 하나
na_action None(기본) 또는 'ignore' — NaN을 변환하지 않고 그대로 유지

1. 딕셔너리로 값 치환

딕셔너리에 없는 값은 자동으로 NaN이 됩니다.

import pandas as pd

grade = pd.Series(['A', 'B', 'C', 'A', 'B'])

grade.map({'A': '우수', 'B': '보통', 'C': '미흡'})
# 0    우수
# 1    보통
# 2    미흡
# 3    우수
# 4    보통
grade2 = pd.Series(['A', 'B', 'D'])   # 'D'는 딕셔너리에 없음
grade2.map({'A': '우수', 'B': '보통', 'C': '미흡'})
# 0     우수
# 1     보통
# 2     NaN   ← 매핑 없으면 NaN

2. 함수로 변환

prices = pd.Series([1000, 2500, 800, 3200])

prices.map(lambda x: x * 1.1)   # 10% 인상
# 0    1100.0
# 1    2750.0
# 2     880.0
# 3    3520.0
def grade_label(score):
    if   score >= 90: return 'A'
    elif score >= 80: return 'B'
    else:             return 'C'

scores = pd.Series([95, 82, 74, 88])
scores.map(grade_label)
# 0    A
# 1    B
# 2    C
# 3    B

3. Series로 변환 (인덱스 기준 매핑)

code    = pd.Series(['KR', 'US', 'JP', 'KR'])
mapping = pd.Series({'KR': '한국', 'US': '미국', 'JP': '일본'})

code.map(mapping)
# 0    한국
# 1    미국
# 2    일본
# 3    한국

4. na_action='ignore' — NaN 건드리지 않기

s = pd.Series(['A', None, 'B'])

s.map({'A': 1, 'B': 2})
# 0    1.0
# 1    NaN   ← None도 변환 시도 → NaN
# 2    2.0

s.map({'A': 1, 'B': 2}, na_action='ignore')
# 0       1
# 1    None   ← None 그대로 유지
# 2       2

map vs apply vs replace

map apply replace
대상 Series Series, DataFrame Series, DataFrame
딕셔너리 미매핑 NaN 원래 값 유지
주 용도 값 치환/변환 복잡한 연산 특정 값만 바꾸기
s = pd.Series([1, 2, 3])

s.map({1: 'a', 2: 'b'})      # 3 → NaN
s.replace({1: 'a', 2: 'b'})  # 3 → 3 (그대로)

응용 사례 1 — 코드값을 레이블로 변환

df = pd.DataFrame({
    '이름':   ['철수', '영희', '민준'],
    '성별코드': [1, 2, 1],
    '등급코드': ['A', 'C', 'B']
})

df['성별'] = df['성별코드'].map({1: '남', 2: '여'})
df['등급'] = df['등급코드'].map({'A': '우수', 'B': '보통', 'C': '미흡'})
#    이름  성별코드 등급코드  성별  등급
# 0  철수     1    A      남   우수
# 1  영희     2    C      여   미흡
# 2  민준     1    B      남   보통

응용 사례 2 — 구간별 레이블 (점수 → 등급)

scores = pd.Series([95, 82, 74, 61, 88])

def to_grade(score):
    if   score >= 90: return 'A'
    elif score >= 80: return 'B'
    elif score >= 70: return 'C'
    else:             return 'D'

scores.map(to_grade)
# 0    A
# 1    B
# 2    C
# 3    D
# 4    B

응용 사례 3 — 외부 테이블과 조인 대용

# 지역코드 테이블
region_name = pd.Series({'SEL': '서울', 'PUS': '부산', 'ICN': '인천'})

orders = pd.DataFrame({
    '주문번호': [1, 2, 3, 4],
    '지역코드': ['SEL', 'PUS', 'SEL', 'ICN']
})

orders['지역명'] = orders['지역코드'].map(region_name)
#    주문번호 지역코드  지역명
# 0     1    SEL    서울
# 1     2    PUS    부산
# 2     3    SEL    서울
# 3     4    ICN    인천

응용 사례 4 — 문자열 전처리

raw = pd.Series(['  서울 ', 'BUSAN', '인 천'])

raw.map(str.strip)                       # 앞뒤 공백 제거
raw.map(str.lower)                       # 소문자 변환
raw.map(lambda x: x.replace(' ', ''))   # 내부 공백 제거

핵심 요약

내용
대상 Series 전용
입력 형태 딕셔너리, 함수, Series
미매핑 값 NaN (딕셔너리 사용 시)
na_action='ignore' NaN은 변환 없이 유지
vs replace 미매핑 시 NaN 반환 vs 원래 값 유지
핵심 직관: map은 "값 → 값" 1:1 변환 전용입니다. 코드값을 사람이 읽기 좋은 레이블로 바꾸거나, 외부 테이블 기준으로 값을 붙이는 작업에 가장 자주 씁니다.
728x90
반응형
Comments