🖇 메서드 기능과 적용 대상
🖇 언제 어떤 걸 써야 할까?
Pandas를 쓰다 보면 값을 바꾸거나 새로운 열을 만들기 위해 사용하는 함수들이 있는데
그중에서도 유난히 헷갈리는 세 가지가 있다.
replace, map, apply
기능도 비슷해 보이고 문법도 닮았지만 이 셋은 적용 대상과 사용 목적이 아주 뚜렷하게 다르다.
이 글에서는 이 세 가지 함수의 차이점, 정확한 개념, 사용법, 적용 예시를 정리해 보았다.
아래의 표로 세 함수의 기능과 적용 대상을 살펴보자.
| 메서드 | 적용 대상 | 기능 요약 |
|---|---|---|
replace | Series & DataFrame | 특정 값을 다른 값으로 바꾼다 |
map | Series만 | 각 원소에 딕셔너리나 함수를 적용 |
apply | Series & DataFrame | 행 또는 열 단위로 함수를 유연하게 적용 |
이렇게만 봤을 때는 와닿지 않을 수 있다.
아래에서 간단한 예제를 통해 세 함수를 비교해 보자.
우선 간단한 예제 데이터프레임을 만들었다.
import pandas as pd
df = pd.DataFrame({
'fruit': ['apple', 'banana', 'apple', 'orange'],
'price': [1000, 2000, 1200, 1500]
})
replace: 특정 값을 다른 값으로 일대일 매핑df['fruit'] = df['fruit'].replace({'apple': 'peach'})
print(df)
'apple' → 'peach'로 변경된다.
복잡한 연산 없이 값 자체를 대체할 때 유용하다.
map: Series의 각 값에 함수 or 딕셔너리 매핑(1) 딕셔너리로 매핑
color_map = {'peach': 'pink', 'banana': 'yellow', 'orange': 'orange'}
df['color'] = df['fruit'].map(color_map)
(2) 함수 적용
df['fruit_length'] = df['fruit'].map(len)
map()은 Series 전용이고, 값마다 직접 변환이 필요할 때 가장 간결하다.
e.g., 문자열 길이 구하기, 특정 범주 색상 지정 등.
apply: 열 or 행 전체에 함수 적용# Series에 적용 (map과 비슷)
df['fruit_upper'] = df['fruit'].apply(lambda x: x.upper())
# DataFrame 전체에 적용 (행/열 단위)
df['total'] = df[['price', 'fruit_length']].apply(sum, axis=1)
apply()는 DataFrame에도 사용 가능하며,
범용성이 좋아 조건에 따라 복잡한 연산, 조건문, 여러 열 간 연산이 필요한 경우 사용된다.
| 상황 | 추천 메서드 | 이유 |
|---|---|---|
| "특정 값만 바꾸고 싶다" | replace() | 딕셔너리 기반으로 딱 떨어지게 바꿀 때 |
| "딕셔너리/단순 함수로 Series 변환하고 싶다" | map() | Series 전용. 값 단위로 깔끔한 변환 가능 |
| "여러 열을 동시에 조작하고 싶다" | apply() | 행/열 단위 연산, 복잡한 로직 처리 가능 |
아래의 예시를 통해 어떨 때 사용되는지 비교해 보자.
사례 1: 성별 데이터 인코딩
df['gender'] = df['gender'].replace({'남자': 1, '여자': 0}) # replace
나이에 따른 연령대 부여
df['age_group'] = df['age'].map(lambda x: '청소년' if x < 20 else '성인') # map
여러 컬럼을 조합한 고객 점수 계산
def calc_score(row):
return row['purchase'] * 0.4 + row['visit'] * 0.6
df['score'] = df.apply(calc_score, axis=1) # apply
지금까지 Pandas에서 헷갈리기 쉬운 세 함수를 비교 정리해 보았다.
replace() → 값 그대로 바꾸고 싶을 때map() → Series를 값 단위로 간단하게 변환할 때apply() → 범용적인 함수 적용, 복잡한 로직 필요할 때이 세 가지를 구분할 수 있게 되면 Pandas 코드의 가독성과 효율성이 훨씬 높아진다.
특히 apply()는 너무 남용하면 느려질 수 있으니,
map() 또는 replace()로 해결 가능한 경우엔 그걸 먼저 고려하는 습관을 가지는 것도 권장된다 :)