본문 바로가기
Data Science

Pandas | apply() 함수

by Sseul.dev 2025. 10. 17.

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, 추가_파라미터))

기억할 것!

  1. apply()는 만능 변환 도구 - 원하는 함수를 자유롭게 적용
  2. 함수 이름만 쓰기 - 괄호 붙이면 오류!
  3. 간단한 건 람다, 복잡한 건 일반 함수
  4. 간단한 연산은 그냥 직접 - apply() 없이도 됨

'Data Science' 카테고리의 다른 글

Pandas | merge()와 join()  (0) 2025.10.18
Pandas | 괄호 () 있고 없고의 차이  (0) 2025.10.15