왜 apply와 lambda를 써야 할까?
for문으로 데이터프레임 처리하려다 속도나 가독성 때문에 고민해본 적 있나요?
apply()와 lambda를 쓰면 반복문 없이도 각 행/열에 함수를 적용할 수 있어요.
lambda란?
f = lambda x: x * 2
print(f(3)) # 결과: 6
- 한 줄짜리 함수 만들기
- 함수 이름 없이도 임시적으로 사용할 수 있음
비교: 일반 함수 vs lambda
# 일반 함수
def double(x):
return x * 2
# 동일한 lambda 함수
lambda x: x * 2
차이점은 lambda는 임시적이고 짧은 함수에 적합하며,
apply()처럼 인라인에서 바로 함수를 써야 할 때 코드가 훨씬 간결해집니다.
apply()란?
import pandas as pd
df = pd.DataFrame({'score': [90, 85, 77, 93]})
df['grade'] = df['score'].apply(lambda x: 'A' if x >= 90 else 'B')
print(df)
- 각 요소에 함수를 "적용(apply)"하는 메서드
- 열 전체, 혹은 행 전체에 함수 적용 가능
apply()의 작동 방식: 열 또는 행을 하나씩 함수에 전달
apply()는 Pandas의 DataFrame에서 각 열 또는 각 행을 반복하며 함수에 넘겨주는 방식으로 작동합니다.
즉, 내부적으로는 루프를 돌고 있지만, 사용자는 함수만 전달하면 되기 때문에 훨씬 간결하고 파이썬스러운 코드를 만들 수 있습니다.
작동 흐름
1. DataFrame을 받아들인다
2. axis 값에 따라 열 또는 행을 하나씩 선택
3. 각 열/행을 Series 객체로 만들어 함수에 전달
4. 함수의 반환값을 모아서 새로운 Series로 반환
실전 예제
import pandas as pd
df = pd.DataFrame({
'이름': ['철수', '영희', '민수'],
'점수': [92, 81, 75]
})
# 점수에 따라 합격 여부 판단
df['결과'] = df['점수'].apply(lambda x: '합격' if x >= 80 else '불합격')
행 기준으로 apply 쓰기 (axis=1)
df = pd.DataFrame({
'국어': [90, 80],
'영어': [70, 85]
})
df['평균'] = df.apply(lambda row: (row['국어'] + row['영어']) / 2, axis=1)
axis=0: 열(column)을 기준으로 작동
많이 사용하는 axis=1과 달리 axis=0은 각 열에 함수가 적용됩니다.
즉, DataFrame의 "열 단위로" 반복하며, 각 열을 Series로 넘겨서 함수를 실행합니다.
import pandas as pd
df = pd.DataFrame({
'math': [90, 85, 80],
'english': [70, 88, 95],
'science': [85, 82, 78]
})
# 각 열의 평균 계산
column_means = df.apply(lambda col: col.mean(), axis=0)
print(column_means)
출력 결과:
math 85.0
english 84.3
science 81.6
dtype: float64
→ 여기서 apply()는 각 열(column) 을 col이라는 Series로 받아 평균을 계산하고 있습니다.
→ axis=0은 열을 순회하면서 함수 적용, axis=1은 행을 순회하면서 함수 적용이라는 점을 기억하세요.
axis 파라미터: 행 vs 열, 어디에 적용할 것인가?
apply()를 사용할 때 자주 마주치는 파라미터 중 하나가 axis입니다.
이 값에 따라 함수가 적용되는 방향이 달라지므로 꼭 이해하고 있어야 하죠.
마무리
lambda는 익명 함수, apply는 각 행/열에 함수를 적용할 수 있게 해주는 도구!
둘을 같이 쓰면 데이터 전처리나 조건 분기 처리가 훨씬 더 직관적이고 간결해집니다.
'파이썬 > 데이터프레임 다루기' 카테고리의 다른 글
이터레이터 vs 제너레이터: 파이썬 반복의 핵심 이해하기 (0) | 2025.03.24 |
---|---|
Pandas groupby 완전 정복: 집계부터 고급 활용까지 (0) | 2025.03.24 |
Pandas pivot_table() 완전 정복 (0) | 2025.03.24 |
Pandas 데이터 포맷 전환: melt()와 pivot() 완전 정리 (0) | 2025.03.24 |
Pandas 멀티인덱스 다루기: stack()과 unstack() 정리 (0) | 2025.03.24 |