데이터 분석을 하다 보면 DataFrame의 각 행(row)에 동일한 연산이나 함수를 일괄 적용해야 하는 경우가 자주 발생합니다. 이럴 때 가장 유용하게 쓰이는 것이 바로 Pandas의 apply() 메서드입니다.
이 튜토리얼에서는 apply()를 사용해 DataFrame의 모든 행에 사용자 정의 함수, 파이썬 내장 함수, 그리고 NumPy 함수를 적용하는 다양한 방법을 예제와 함께 살펴보겠습니다.
apply() 메서드란?
apply()는 DataFrame의 각 행 또는 열에 함수를 적용할 수 있게 해주는 메서드입니다. 예를 들어, 각 행의 숫자들을 곱하거나 더한 결과를 새로운 열로 추가하고 싶을 때 apply()가 매우 유용합니다.
핵심은 axis 인자입니다. axis=1로 설정하면 각 행 단위로 함수가 적용되고, 기본값인 axis=0으로 설정하면 각 열 단위로 적용됩니다.
예제 1: 사용자 정의 함수 적용하기
먼저 두 값을 곱하는 함수를 직접 만들어 각 행에 적용해 보겠습니다. 람다(lambda) 함수를 활용하면 코드를 간결하게 작성할 수 있습니다.
# pandas 패키지 임포트
import pandas as pd
# 곱셈 함수 정의
def multiply(x, y):
return x * y
# DataFrame 생성용 딕셔너리
data = {
'Maths': [10, 34, 53],
'Programming': [23, 12, 43]
}
# 데이터로 DataFrame 생성
data_frame = pd.DataFrame(data)
# 적용 전 DataFrame 출력
print('--------------------Before------------------')
print(data_frame)
print()
# multiply 함수를 각 행에 적용하여 새로운 열 생성
data_frame['Multiply'] = data_frame.apply(
lambda row: multiply(row['Maths'], row['Programming']), axis=1
)
# 적용 후 DataFrame 출력
print('--------------------After------------------')
print(data_frame)실행 결과
위 프로그램을 실행하면 다음과 같은 결과를 얻을 수 있습니다.
--------------------Before------------------ Maths Programming 0 10 23 1 34 12 2 53 43 --------------------After------------------ Maths Programming Multiply 0 10 23 230 1 34 12 408 2 53 43 2279
각 행에서 'Maths' 값과 'Programming' 값이 곱해져 새로운 'Multiply' 열에 저장된 것을 확인할 수 있습니다.
예제 2: 파이썬 내장 함수 적용하기
사용자 정의 함수뿐만 아니라 sum, pow 같은 파이썬 내장 함수도 바로 적용할 수 있습니다. 아래 예제는 각 행의 합계를 구하는 예시입니다.
# pandas 패키지 임포트
import pandas as pd
# DataFrame 생성용 딕셔너리
data = {
'Maths': [10, 34, 53],
'Programming': [23, 12, 43]
}
# 데이터로 DataFrame 생성
data_frame = pd.DataFrame(data)
# 적용 전 DataFrame 출력
print('--------------------Before------------------')
print(data_frame)
print()
# 내장 sum 함수를 각 행에 적용
data_frame['Multiply'] = data_frame.apply(sum, axis=1)
# 적용 후 DataFrame 출력
print('--------------------After------------------')
print(data_frame)실행 결과
--------------------Before------------------ Maths Programming 0 10 23 1 34 12 2 53 43 --------------------After------------------ Maths Programming Multiply 0 10 23 33 1 34 12 46 2 53 43 96
각 행의 두 값이 더해져 합계가 새로운 열로 추가되었습니다.
예제 3: NumPy 모듈의 함수 적용하기
NumPy 모듈에서 제공하는 함수도 apply()와 함께 사용할 수 있습니다. 벡터화 연산에 최적화된 NumPy 함수를 활용하면 대용량 데이터 처리 시 성능상 이점을 얻을 수 있습니다.
# pandas 패키지 임포트
import pandas as pd
# NumPy 모듈 임포트
import numpy as np
# DataFrame 생성용 딕셔너리
data = {
'Maths': [10, 34, 53],
'Programming': [23, 12, 43]
}
# 데이터로 DataFrame 생성
data_frame = pd.DataFrame(data)
# 적용 전 DataFrame 출력
print('--------------------Before------------------')
print(data_frame)
print()
# NumPy의 sum 함수를 각 행에 적용
data_frame['Multiply'] = data_frame.apply(np.sum, axis=1)
# 적용 후 DataFrame 출력
print('--------------------After------------------')
print(data_frame)실행 결과
--------------------Before------------------ Maths Programming 0 10 23 1 34 12 2 53 43 --------------------After------------------ Maths Programming Multiply 0 10 23 33 1 34 12 46 2 53 43 96
마무리
지금까지 살펴본 것처럼 DataFrame의 apply() 메서드를 활용하면 사용자 정의 함수, 파이썬 내장 함수, NumPy 함수 등 어떤 종류의 함수든 모든 행에 손쉽게 적용할 수 있습니다. 특히 axis=1 옵션만 기억해두면 행 단위 연산은 어렵지 않습니다.
추가로 참고할 점은, 대규모 데이터에서는 apply()보다 벡터화 연산(예: data_frame['Maths'] * data_frame['Programming'])이 훨씬 빠르다는 것입니다. 상황에 맞게 적절한 방법을 선택해 활용해 보시기 바랍니다.
튜토리얼과 관련해 궁금한 점이 있다면 댓글로 남겨주세요!