728x90
Pandas를 사용하다 보면 다음과 같은 작업이 필요할 때가 있습니다.
- 모든 수치에 단위를 붙이고 싶을 때
- 전체 셀의 포맷을 문자열로 바꾸고 싶을 때
- 결측값을 특정 텍스트로 대체하거나, 셀에 조건 기반 포맷팅을 하고 싶을 때
이럴 때 DataFrame 전체 셀에 함수를 적용할 수 있는 applymap() 이 강력한 도구가 됩니다.
먼저 예제 데이터를 확인하겠습니다.
예제 데이터
import pandas as pd
import numpy as np
df = pd.DataFrame({
'math': [90, 80, 70],
'eng': [85, 75, 65],
'sci': [88, 78, np.nan]
})
기본 문법
DataFrame.applymap(func)
- 각 셀에 대해 func(value) 를 수행
- 반환 결과는 DataFrame
1. 예제: 숫자에 단위 붙이기
df.applymap(lambda x: f"{int(x)}점" if pd.notna(x) else "결측")
→ 각 셀에 "점"을 붙이고, 결측치는 "결측"으로 처리
2. 예제: 셀 값 제곱하기
df.applymap(lambda x: x ** 2 if pd.notna(x) else x)
→ 수치 데이터 전체 제곱 계산
3. 예제: 모든 셀 문자열화
df.applymap(str)
→ 셀을 전부 문자열로 변환 (형태 통일 목적)
4. 예제: 셀 포맷 일괄 처리 (%, 소수점 등)
df.applymap(lambda x: f"{x:.1f}%" if pd.notna(x) else "")
→ 퍼센트 표기 등, 시각화 전 전처리에 유용
5. 예제: 결측치 치환
df.applymap(lambda x: x if pd.notna(x) else 0)
→ fillna()로 대체해도 되지만, 다른 조건과 함께 쓰면 applymap()이 더 유연함
applymap()과 다른 함수들과의 차이
함수 | 대상 | 목적 | 예시 |
map() | Series | 개별 값 변환 | s.map(lambda x: x + 1) |
apply() | Series / DataFrame | 열 전체 또는 행 전체에 함수 | df.apply(sum, axis=1) |
applymap() | DataFrame | 각 셀에 함수 적용 | df.applymap(str) |
→ applymap()은 DataFrame 전용이다. Series에는 사용 불가!
여기서 또 하나의 Tip을 보여드리면
수치 데이터를 문자열로 치환 후 시각화용 저장도 코드 한줄로 가능합니다.
df.applymap(lambda x: f"{int(x)}점" if pd.notna(x) else "미제출").to_csv("scores_clean.csv", index=False)
applymap()은 Pandas의 모든 셀을 동일하게 처리할 때 매우 유용한 함수입니다.
단일 열이면 map(), 행/열 단위면 apply(),
셀 단위 전체 처리라면 applymap() 함수를 사용해 보시기 바랍니다.
728x90
반응형
'python > Pandas | Numpy' 카테고리의 다른 글
[Pandas] clip() - 이상값 방어의 핵심 (0) | 2025.05.02 |
---|---|
[Pandas] where() - 조건을 만족하는 값은 살리고, 아니면 치환 (0) | 2025.04.29 |
[Pandas] map() (조건 라벨링, 값 변환, 딕셔너리 매핑까지 Series 변환의 핵심) (0) | 2025.04.24 |
[Pandas] explode() (리스트가 들어있는 셀 행마다 분해) (1) | 2025.04.24 |
[Pandas] eval() (열 간 수식을 짧고 빠르게 처리) (0) | 2025.04.24 |