반응형
Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- gas
- Excel
- hive
- Apache
- PANDAS
- google apps script
- Google Excel
- Google Spreadsheet
- math
- PySpark
- django
- list
- GIT
- Python
- Redshift
- Java
- 파이썬
- array
- numpy
- string
- matplotlib
- Kotlin
- Mac
- Tkinter
- SQL
- dataframe
- c#
- PostgreSQL
- Github
Archives
- Today
- Total
달나라 노트
Python Pandas : map 본문
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
반응형
'Python > Python Pandas' 카테고리의 다른 글
| Python Pandas : agg (열마다 다른 집계함수 적용) (0) | 2026.05.20 |
|---|---|
| Python Pandas : div (나눗셈) (0) | 2026.05.20 |
| Python Pandas : std() — 표준편차를 계산하는 메서드 (0) | 2026.05.14 |
| Python Pandas : Series .values vs .to_numpy() (0) | 2026.05.14 |
| Python Pandas : where & mask (값 필터링하여 바꾸기) (0) | 2026.05.12 |
Comments
