Pandas에서 데이터를 자유자재로 가공하고 싶다면? apply() 함수를 배워야 합니다!
# 이런 게 가능해집니다
df['score'].apply(등급_매기기)
df['price'].apply(lambda x: x * 1.1) # 10% 할인
df['name'].apply(이름_가리기)
apply()는 "만능 변환기"라고 생각하면 됩니다.
목차
1. apply() 함수란?
2. 기본 사용법
3. 직접 만든 함수 사용하기
4. 람다 함수와 apply()
5. 실전 활용 예시
6. 주의사항과 팁
7. 마무리
1. apply() 함수란?
기본 개념
apply()는 데이터의 각 값에 함수를 적용하는 함수입니다.
# 간단하게 말하면
df['컬럼명'].apply(함수명)
이렇게 하면 컬럼의 모든 값 하나하나에 함수가 적용됩니다!
왜 필요할까?
# 예를 들어 이런 데이터가 있다면
점수 = [85, 92, 78, 95, 88]
# 각 점수를 등급으로 바꾸고 싶을 때
# 일일이 하나씩? ❌ 너무 번거로움!
# apply() 사용? ✅ 한 줄로 해결!
2. 기본 사용법
간단한 예시: 숫자 제곱하기
import pandas as pd
# 시험 점수 데이터
scores_df = pd.DataFrame({
'name': ['민지', '하늘', '서준', '유나'],
'score': [85, 92, 78, 95]
})
print(scores_df)
name score
0 민지 85
1 하늘 92
2 서준 78
3 유나 95
점수를 제곱해보겠습니다:
# 방법 1: 직접 계산 (간단한 경우)
scores_df['score'] ** 2
# 방법 2: apply() 사용
def square(x):
return x ** 2
scores_df['score'].apply(square)
출력:
0 7225
1 8464
2 6084
3 9025
Name: score, dtype: int64
⚠️ 중요한 규칙!
# ✅ 올바른 방법 - 함수 이름만
scores_df['score'].apply(square)
# ❌ 틀린 방법 - 괄호 붙이면 안 됨!
scores_df['score'].apply(square()) # 오류!
함수를 넘길 때는 이름만 쓰고 괄호는 쓰지 않습니다!
3. 직접 만든 함수 사용하기
예시 1: 성적 등급 매기기
# 학생 성적 데이터
students_df = pd.DataFrame({
'name': ['김철수', '이영희', '박민준', '최서연', '정하늘'],
'score': [95, 87, 76, 92, 68]
})
# 등급 매기는 함수 만들기
def get_grade(score):
if score >= 90:
return 'A'
elif score >= 80:
return 'B'
elif score >= 70:
return 'C'
elif score >= 60:
return 'D'
else:
return 'F'
# apply로 적용!
students_df['grade'] = students_df['score'].apply(get_grade)
print(students_df)
출력:
name score grade
0 김철수 95 A
1 이영희 87 B
2 박민준 76 C
3 최서연 92 A
4 정하늘 68 D
예시 2: 쇼핑몰 할인율 적용
# 상품 가격 데이터
products_df = pd.DataFrame({
'product': ['노트북', '마우스', '키보드', '모니터'],
'price': [1200000, 35000, 89000, 450000]
})
# VIP 고객 30% 할인 함수
def vip_discount(price):
return int(price * 0.7) # 30% 할인
# 할인가 계산
products_df['discounted_price'] = products_df['price'].apply(vip_discount)
print(products_df)
출력:
product price discounted_price
0 노트북 1200000 840000
1 마우스 35000 24500
2 키보드 89000 62300
3 모니터 450000 315000
예시 3: 개인정보 마스킹
# 고객 데이터
customers_df = pd.DataFrame({
'name': ['김민수', '이영희', '박철수'],
'phone': ['010-1234-5678', '010-9876-5432', '010-5555-1234']
})
# 전화번호 마스킹 함수 (뒷자리 4개 숨기기)
def mask_phone(phone):
return phone[:-4] + '****'
customers_df['masked_phone'] = customers_df['phone'].apply(mask_phone)
print(customers_df)
출력:
name phone masked_phone
0 김민수 010-1234-5678 010-1234-****
1 이영희 010-9876-5432 010-9876-****
2 박철수 010-5555-1234 010-5555-****
4. 람다 함수와 apply()
람다 함수란?
일회용 간단한 함수를 한 줄로 만드는 방법입니다!
# 일반 함수
def add_ten(x):
return x + 10
# 람다 함수 (똑같은 기능)
lambda x: x + 10
문법 구조
lambda 파라미터: 리턴값
언제 사용할까?
간단하고 한 번만 쓸 함수라면 람다 함수가 편합니다!
# 온라인 강의 수강료 데이터
courses_df = pd.DataFrame({
'course': ['파이썬 기초', '데이터 분석', '머신러닝', '웹개발'],
'price': [50000, 80000, 120000, 90000]
})
# 10% 부가세 추가 (람다 함수 사용)
courses_df['final_price'] = courses_df['price'].apply(lambda x: x * 1.1)
print(courses_df)
출력:
course price final_price
0 파이썬 기초 50000 55000.0
1 데이터 분석 80000 88000.0
2 머신러닝 120000 132000.0
3 웹개발 90000 99000.0
조건문과 함께 사용하기
# 영화 평점 데이터
movies_df = pd.DataFrame({
'title': ['기생충', '범죄도시', '명량', '극한직업'],
'rating': [8.6, 7.2, 7.9, 8.1]
})
# 평점 8.0 이상이면 '추천', 아니면 '보통'
movies_df['recommendation'] = movies_df['rating'].apply(
lambda x: '추천' if x >= 8.0 else '보통'
)
print(movies_df)
출력:
title rating recommendation
0 기생충 8.6 추천
1 범죄도시 7.2 보통
2 명량 7.9 보통
3 극한직업 8.1 추천
람다 함수 조건문 문법
lambda x: '참일 때 값' if 조건식 else '거짓일 때 값'
5. 실전 활용 예시
복잡한 조건 처리: 배송비 계산
# 쇼핑몰 주문 데이터
orders_df = pd.DataFrame({
'product': ['책', '노트북', '마우스', '의자', '텀블러'],
'price': [15000, 1200000, 35000, 450000, 25000],
'quantity': [2, 1, 3, 1, 4]
})
# 총 금액 계산
orders_df['total'] = orders_df['price'] * orders_df['quantity']
# 배송비 계산 함수 (50,000원 이상 무료배송)
def calculate_shipping(total):
if total >= 50000:
return 0
else:
return 3000
orders_df['shipping'] = orders_df['total'].apply(calculate_shipping)
print(orders_df)
출력:
product price quantity total shipping
0 책 15000 2 30000 3000
1 노트북 1200000 1 1200000 0
2 마우스 35000 3 105000 0
3 의자 450000 1 450000 0
4 텀블러 25000 4 100000 0
여러 파라미터 사용하기
# 음식점 리뷰 데이터
reviews_df = pd.DataFrame({
'restaurant': ['한식당', '일식집', '중식당', '양식당'],
'rating': [4.2, 3.8, 4.5, 3.5]
})
# 평점 구간 판단 함수
def check_rating_range(rating, min_score, max_score):
if min_score <= rating < max_score:
return 'O'
else:
return 'X'
# 평점이 4.0~5.0 사이인지 확인
reviews_df['is_good'] = reviews_df['rating'].apply(
lambda x: check_rating_range(x, 4.0, 5.0)
)
print(reviews_df)
출력:
restaurant rating is_good
0 한식당 4.2 O
1 일식집 3.8 X
2 중식당 4.5 O
3 양식당 3.5 X
다른 구간도 쉽게 확인:
# 평점이 3.5~4.0 사이인지 확인
reviews_df['is_average'] = reviews_df['rating'].apply(
lambda x: check_rating_range(x, 3.5, 4.0)
)
6. 주의사항과 팁
1) 함수 이름만 쓰기
# ✅ 올바름
df['column'].apply(my_function)
# ❌ 틀림
df['column'].apply(my_function())
2) 간단한 연산은 직접 하기
# 간단한 계산은 apply() 없이!
df['price'] * 1.1 # ✅ 빠르고 간단
# apply()는 복잡한 로직에 사용
df['price'].apply(lambda x: x * 1.1) # 불필요
3) 성능 고려
apply()는 편리하지만 느릴 수 있습니다!
# 간단한 연산: 벡터화 연산이 훨씬 빠름
df['price'] * 0.9 # ⚡ 빠름
# 복잡한 로직: apply() 사용
df['text'].apply(복잡한_텍스트_처리) # 🐢 느림 (but 필요)
4) 람다 vs 일반 함수
상황 | 추천 |
한 줄로 끝나는 간단한 로직 | 람다 함수 ✅ |
여러 줄의 복잡한 로직 | 일반 함수 ✅ |
여러 곳에서 재사용 | 일반 함수 ✅ |
일회성 사용 | 람다 함수 ✅ |
5) 비교 정리
cut() vs apply()
# cut(): 구간 나누기 전문
pd.cut(df['age'], bins=[0, 20, 40, 60, 80])
# apply(): 자유로운 가공
df['age'].apply(내가_만든_함수)
언제 뭘 쓸까?
상황 | 추천 함수 |
단순히 구간으로 나누기 | cut() 더 간단 |
복잡한 조건 처리 | apply() 더 유연 |
커스텀 로직 필요 | apply() 필수 |
7. 마무리
핵심 요약
# 1. 기본 사용법
df['column'].apply(함수명) # 괄호 없이!
# 2. 람다 함수
df['column'].apply(lambda x: x * 2)
# 3. 조건문
df['column'].apply(lambda x: 'A' if x > 10 else 'B')
# 4. 복잡한 함수
df['column'].apply(lambda x: 내_함수(x, 추가_파라미터))
기억할 것!
- apply()는 만능 변환 도구 - 원하는 함수를 자유롭게 적용
- 함수 이름만 쓰기 - 괄호 붙이면 오류!
- 간단한 건 람다, 복잡한 건 일반 함수
- 간단한 연산은 그냥 직접 - apply() 없이도 됨
'Data Science' 카테고리의 다른 글
Pandas | merge()와 join() (0) | 2025.10.18 |
---|---|
Pandas | 괄호 () 있고 없고의 차이 (0) | 2025.10.15 |